2016-11-16 1 views
-4

실행중인 스레드를 1 초에서 몇 개월 사이의 시간 간격으로 차단해야하는 프로젝트 작업 중입니다.Int32.MaxValue보다 긴 스레드 차단

내가 사용한 방법은 EventWaitHandle.WaitOne 메서드 (또는 형제 중 하나)를 지정된 시간 제한으로 사용하는 것입니다. 문제는 이러한 모든 메서드가 최대 차단 시간을 약 25 일로 제한하는 매개 변수로 Int32를 사용한다는 것입니다.

아무도 해결책을 알고 있습니까? 어떻게 Int32.MaxValue 밀리 초 이상 스레드를 차단할 수 있습니까? 전용 스레드에 의해 실행되는 코드입니다 니펫을

while(_doRun) 
{ 
    // Determine the next trigger time 
    var nextOccurence = DetermineNextOccurence(); 
    var sleepSpan = nextOccurence - DateTime.Now; 

    // if the next occurence is more than Int32.MaxValue millisecs away, 
    // loop to work around the limitations of EventWaitHandle.WaitOne() 
    if (sleepSpan.TotalMilliseconds > Int32.MaxValue) 
    { 
    var idleTime = GetReasonableIdleWaitTimeSpan(); 
    var iterationCount = Math.Truncate(sleepSpan.TotalMilliseconds/idleTime.TotalMilliseconds); 
    for (var i = 0; i < iterationCount; i++) 
    { 
     // Wait for the idle timespan (or until a Set() is called). 
     if(_ewh.WaitOne(idleTime)) { break; } 
    } 
    } 
    else 
    { 
    // if the next occurence is in the past, trigger right away 
    if (sleepSpan.TotalMilliseconds < 0) { sleepSpan = TimeSpan.FromMilliseconds(25); } 

    // Wait for the sleep span (or until a Set() is called). 
    if (!_ewh.WaitOne(sleepSpan)) 
    { 
     // raise the trigger event 
     RaiseTriggerEvent(); 
    } 
    } 
} 

:

감사

UPDATE 그냥 레코드에 대한

, 여기에 드디어 해낸 코드입니다. EventWaitHandle.Set()은 응용 프로그램이 종료되거나 스케줄러를 취소 할 때만 호출됩니다.

도움을 주신 분들께 감사드립니다.

+0

정말 응용 프로그램을 오래 실행할 수 있다고 생각하십니까? 테스트 중 23 일째에 확실히 부서 질 것입니다. –

+11

나에게 소리가 나에게는 디자인에 끔찍한 오류가 있습니다. – eurotrash

+0

어떤 이벤트에서 스레드를 시작해야합니다. 또는 스레드를 낭비하지 않는 타이머를 사용하십시오. –

답변

0

시도 handle.WaitOne(System.Threading.Timeout.Infinite).

무한대로 실행하지 않으려면 다른 스레드에서 대기 핸들을 외부로 트리거하십시오.

UPDATE :

다른 스레드를 사용하지 않으려면, 루프를 사용 : 당신은 Int32에 맞는 여러 조각으로 시간 제한 시간 범위를 분할해야

bool isTriggered = false; 
while (!isTriggered) { 
    isTriggered = handle.WaitOne(timeout); 
    //Check if time is expired and if yes, break 
} 

을 . isTriggered 변수는 핸들이 트리거되었거나 시간이 초과 된 경우 표시됩니다.

+2

당신은 대답을 downvoted 누가 질문자 였는지 확신 할 수 없습니다 .. – stuartd

+0

충분히 공정. 이 스레드에 관해서는, 나는 돈이 없다. – Sefe

+0

@Sefe 나는 투표하지 않았다. (어쨌든 명성 점수가 충분하지 않다.) 그러나 제안하는 해결 방법은 지나가는 시간을 알기 위해 다른 스레드가 필요합니다. – JuiceOntour