실행중인 스레드를 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()
은 응용 프로그램이 종료되거나 스케줄러를 취소 할 때만 호출됩니다.
도움을 주신 분들께 감사드립니다.
정말 응용 프로그램을 오래 실행할 수 있다고 생각하십니까? 테스트 중 23 일째에 확실히 부서 질 것입니다. –
나에게 소리가 나에게는 디자인에 끔찍한 오류가 있습니다. – eurotrash
어떤 이벤트에서 스레드를 시작해야합니다. 또는 스레드를 낭비하지 않는 타이머를 사용하십시오. –