【发布时间】:2011-10-20 18:42:25
【问题描述】:
在我正在开发的应用程序中,我有一个简单的主窗体并显示日志数据,以及一个在循环中自主完成工作的工作线程。
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 之前空闲 15 分钟。到false。
我宁愿能够在主循环完成一项工作后立即抛出某种事件来停止主循环。
谁能指出正确的方向如何做到这一点,或者如果因为我完全误解了线程而需要完全重写,请告诉我解释这些原则的地方?
【问题讨论】:
标签: c# multithreading