을 Task.Run를 사용하고 대기합니다 :올바른 방법은 내가 타이머에 의해 실행되는 코드의 다음 블록이
private void CheckForScheduleItemsTimerOnElapsed(Object sender, ElapsedEventArgs elapsedEventArgs)
{
if (CurrentlyProcessingMsgs)
return;
CurrentlyProcessingMsgs = true;
var task = Task.Run(() => {
CheckForScheduleItems.Process(_cancellationToken);
}, _cancellationToken);
task.Wait(_cancellationToken);
CurrentlyProcessingMsgs = false;
}
지금은 데 문제가를 그 어떤 경우에는, 라인
CurrentlyProcessingMsgs = false;
이 호출되지 않습니다. Task.Wait가 작업이 완료 될 때까지 기다렸다가 계속 진행하여 그 플래그를 다시 설정해야한다는 것이 내 이해입니다. 그러나 어떤 경우에는 그런 일이 일어나지 않습니다. (참고 :이 타이머는 서비스에 의해 관리되고 있습니다.) 어떤 상황이 발생했는지는 시스템 종료시에 CurrentlyProcessingMsgs의 값을 확인하는 중이고 작업이 완료된 후에도 여전히 유효합니다.
위의 목표는 위에 표시된 것처럼 여러 타이머를 사용 중지하는 것입니다. 각 타이머는 위에 표시된 것과 비슷한 처리를 수행하며 각 프로세스를 별도의 스레드에서 실행하려고합니다. CancellationToken에 대한 이해가 잘못되었습니다.이 경우 타이머와 작업을 설정하여 이러한 메서드를 실행하고 각각을 별도의 스레드에 배치하는 올바른 방법은 무엇입니까?
타이머에 대한 질문은 사용중인 타이머에 따라 다릅니다. .NET에 내장 된 일부 타이머는 자동으로 스레드 풀을 사용하여 타이머를 시작합니다 (Task.Run이 수행하는 것과 동일한 작업). 사용중인 타이머 클래스를 표시해야합니다. 당신은 이미하고 싶은 일을하고 있을지도 모릅니다. –
System.Timers.Timer 클래스를 사용하여 타이머를 시작합니다. –
['Timer.SynchronizingObject'] (https://msdn.microsoft.com/en-us/library/system.timers.timer.synchronizingobject (v = vs.110) .aspx) 값이 설정되어 있습니까? 'null'인 경우 타이머가 이미 타이머 틱을 실행하는 새 스레드를 만들고 있으므로 추가 작업을 수행 할 필요가 없습니다. –