在我正在开发的一个应用程序中,我有一个简单的坐在那里并显示日志数据的主窗体,以及一个自主完成循环工作的工作线程。优雅地关闭了一个线程
MyWorker worker = new MyWorker();
MainForm mainForm = new MainForm();
// Subscribe form to log event so log data gets displayed
worker.Log += mainForm.Log;
// Start the worker thread's MainLoop
new Thread(new ThreadStart(worker.MainLoop)).Start();
// Show the form (blocking)
Application.Run(mainForm);
// If we end up here, the form has been closed and the worker has to stop running
worker.Running = false;
正如您所看到的,只要窗体关闭,工作线程应该停止。这名工人是这样的:
public class MyWorker
{
public String Running { get; set; }
public MyWorker()
{
Running = true;
}
public void MainLoop()
{
while (Running)
{
DoExtensiveWork1();
if (!Running) return;
DoExtensiveWork2();
if (!Running) return;
DoExtensiveWork3();
if (!Running) return;
DoExtensiveWork4();
if (!Running) return;
DoExtensiveWork5();
if (!Running) return;
// We have to wait fifteen minutes (900 seconds)
// before another "run" can be processed
for (int i = 0; i < 900; i++)
{
Thread.Sleep(1000);
if (!Running) return;
}
}
}
}
正如你所看到的,我想线程能够连续工作的操作之间切换时停止,而不是在一个操作中。当一个操作(DoExtensiveWorkN
)完成时,其状态和结果将保留在磁盘或数据库中,因此在操作正在进行时退出(例如,通过Thread.Abort
)不是选项。
但是,我发现这段代码我刚刚写了一些令人厌恶的代码,特别是睡眠时间为900秒的“等待循环”,以防止线程在检测到Running
已被设置为false
。
我宁愿能够抛出某种事件来完成一项工作后立即停止主循环。
任何人都可以指出我正确的方向如何做到这一点,或者如果因为我完全误解了线程而需要全部重写,请告诉我某处解释这些原则的地方?
定时器不会解决我遇到的主要问题:我不希望工作在表单关闭时继续进行,并且我不想添加大量代码来检查该问题。 – CodeCaster
@CodeCaster:啊,我误解了“在操作正在进行时退出(例如,通过Thread.Abort)不是一个选项”来表示整个线程。我的想法然后会使用一系列的行动,但铱星击败了我。尽管如此,我仍然更喜欢15分钟的计时器。 :) – Chris
我可以更清楚地描述。 (还是)感谢你的建议。 :-) – CodeCaster