メイン UI スレッドと 4 つのタスクで構成される WinForms アプリケーションがあります。私のメイン フォームには、次のようなプライベート メンバー レベル変数があります。
private bool keepThreadsRunning = false;
メインフォームの Load() イベントには、次のものがあります。
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());
各 DoStuff() メソッドの内部には、基本的に次のものがあります。
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() 呼び出しにある場合でも)? そして、私が今コーディングしている方法よりも、これを達成するためのより良い方法はありますか?
編集 - タスクのキャンセル (アプリの終了時) について簡単に調べましたが、タスクがキャンセルされたかどうかを判断するために定期的にキャンセル トークンをチェックする必要があることを理解しています。一部のタスクを 30 秒ごとに実行する必要があることを考えると、その 30 秒待機 (現在は Thread.Sleep()) を実装する方法がわかりませんでしたが、タスクはキャンセル トークンをチェックしています。