在阅读了几篇文章后,我仍然不确定我是否理解了多线程来解决我的特定问题。如何在主窗体中等待工作线程?
我有一个主窗体将启动一个后台工作线程(工人)。工作者线程将执行一个While(!Stopping)无限循环,并且将在每次迭代结束时通过全局Stopping对象(只读锁对象)终止睡眠。当用户按下“停止”按钮时工作正常, 工作人员将在当前迭代后停止。
现在我想要当用户关闭主窗体时,它会先设置停止标志,让工作线程 完成当前的工作。之后,主表单将关闭。似乎很简单,但我无法使其工作。
我试过了worker.Join(),或者在while循环中测试了woker.IsAlive,但是这两种情况都会在几秒后因为某种原因锁定应用程序(主窗体)?
以下是我的代码Form_Closing事件处理中(不工作):
// Tell the thread to stop the file
Stop();
Logger.Info("Stopping the thread by Close the application");
//Not working as well
//worker.Join();
while (worker.IsAlive)
{
Thread.Sleep(5000);
Logger.Info("After sleep for 5 seconds");
}
Logger.Info("worker thread stopped");
一件事有趣的是,工作线程似乎总是写日志事件,直到每个循环迭代,那么剩下的结束日志条目将在 while(worker.IsAlive)循环内部成为主窗体事件。
谢谢,这个解决方案似乎运作良好。 – 2010-10-06 21:40:50