在我正在开发的应用程序中,我有一个主窗体,它只是坐在那里显示日志数据,并有一个工作线程自主循环运行。
如您所见,我希望线程能够在切换到下一个工作操作时停止,但在操作过程中不要停止。当操作(
然而,我认为我刚写的代码非常丑陋,特别是“等待循环”,它会休眠900次,每次1秒钟,以防止线程在检测到
我更希望能够抛出某种事件,在完成一项工作后尽快停止主循环。
有人可以指点我如何做到这一点吗?或者如果需要完全重写,因为我完全误解了线程,请告诉我一些解释这些原则的地方?
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次,每次1秒钟,以防止线程在检测到
Running
已设置为false
之前闲置15分钟。我更希望能够抛出某种事件,在完成一项工作后尽快停止主循环。
有人可以指点我如何做到这一点吗?或者如果需要完全重写,因为我完全误解了线程,请告诉我一些解释这些原则的地方?