我有一个 WinForms 应用程序,它由一个主 UI 线程和 4 个任务组成。我的主表单有一个私有成员级别变量,如下所示:
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();
在任务管理器中查看我的应用程序,当我关闭表单时,似乎该过程正在结束,但我对这四个任务有点困惑。我对 this.Close() 的调用是否真的导致这些任务终止(即使它们在发生时在 Thread.Sleep() 调用中)?有没有比我现在编写代码更好的方法来实现这一点?
编辑 - 我已经简要地查看了任务取消(当我的应用程序退出时),但我的理解是我的任务需要定期检查取消令牌以确定它们是否已被取消。鉴于我的一些任务需要每 30 秒运行一次,我无法弄清楚如何实现 30 秒等待(当前是 Thread.Sleep())并且仍然让任务检查取消令牌。