주 UI 스레드와 4 개의 작업으로 구성된 WinForms 응용 프로그램이 있습니다. 내 기본 양식이 같은 개인 회원 레벨 변수가 있습니다) (내 DoStuff의 각각의 내부실행중인 작업이있는 닫는 양식
keepThreadsRunning = true;
var task1Worker = Task.Factory.StartNew(() => DoStuff1());
var task2Worker = Task.Factory.StartNew(() => DoStuff2());
var task3Worker = Task.Factory.StartNew(() => DoStuff3());
var task4Worker = Task.Factory.StartNew(() => DoStuff4());
: 내 기본 폼의 Load() 이벤트에서
private bool keepThreadsRunning = false;
을, 나는 다음과 같은이 방법, 기본적으로 내가이 있습니다
while (keepThreadsRunning)
{
// do work here
Thread.Sleep(30000); // a couple of my tasks only need to run every 30 seconds or so
}
마지막으로, 내 Form_Closing() 이벤트 핸들러에서, 나는 다음과 같습니다
keepThreadsRunning = false;
this.Close();
작업 관리자에서 내 응용 프로그램을보고 내 양식을 닫을 때 프로세스가 끝났지 만 4 가지 작업에 대해서는 약간 혼란스러워 보입니다. this.Close()에 대한 호출이 실제로 해당 작업을 종료하게합니다 (Thread.Sleep() 호출이 발생하더라도). 그리고 지금 코딩하는 방식보다 더 좋은 방법이 있습니까?
EDIT - 앱을 종료 할 때 잠깐 살펴 봤지만 내 작업에서 취소 토큰을 주기적으로 확인하여 취소되었는지 확인해야합니다. 일부 작업이 매 30 초마다 실행되어야한다는 것을 감안할 때 30 초 대기 (현재 Thread.Sleep())를 구현하는 방법을 파악할 수 없으며 작업에 취소 토큰을 확인해야합니다. WaitHandle이 설정 될 때까지
do {
// do work here
} while (!threadTerminationHandle.WaitOne(TimeSpan.FromSeconds(30))
이 대기 : 스레드에서
var threadTerminationHandle = new ManualResetEvent(false);
: