C# 如何在主窗体中等待工作线程?
在读了几篇文章之后,我仍然不确定我是否理解多线程来解决我的问题 特别的问题 我有一个主窗体,它将启动一个后台工作线程(worker)。工作线程将执行While(!Stopping)无限循环,并将在每次迭代结束时休眠,并由全局停止对象(只读锁对象)终止。当用户按下停止按钮时,工作正常 工作进程将在当前迭代后停止 现在我想当用户关闭主窗体时,它将首先设置停止标志,让工作线程 完成当前的工作。之后,主窗体将关闭。看起来很简单,但我不能让它工作 我在while循环中尝试了worker.Join()或test woker.IsAlive,但由于某种原因,这两种情况都会在几秒钟后锁定应用程序(主窗体) 以下是我在Form_关闭事件处理程序中的代码(不工作): 有趣的是,工作线程似乎总是在每次循环迭代结束之前写入日志事件,然后日志项的其余部分将成为内部的主窗体事件C# 如何在主窗体中等待工作线程?,c#,multithreading,C#,Multithreading,在读了几篇文章之后,我仍然不确定我是否理解多线程来解决我的问题 特别的问题 我有一个主窗体,它将启动一个后台工作线程(worker)。工作线程将执行While(!Stopping)无限循环,并将在每次迭代结束时休眠,并由全局停止对象(只读锁对象)终止。当用户按下停止按钮时,工作正常 工作进程将在当前迭代后停止 现在我想当用户关闭主窗体时,它将首先设置停止标志,让工作线程 完成当前的工作。之后,主窗体将关闭。看起来很简单,但我不能让它工作 我在while循环中尝试了worker.Join()或te
while(worker.IsAlive)循环。您正在创建一个死锁,在您请求的任何位置放置一个断点并释放锁定对象。您还可以使用该类来测试锁是否可用,而不是创建死锁。非常熟悉VS中的线程窗口。Join将始终等待线程,在UI线程中使用它将使应用程序看起来被锁定。 IsAlive不要阻止GUI线程中的任何内容,这是您的线程。睡眠 改为做这样的事情:
while (worker.IsAlive)
{
Thread.sleep(50);
Application.DoEvents();
}
请记住,您使用的任何代码如果导致UI线程暂停其正常的发送消息义务,都会对用户造成挂起。换句话说,不要调用任何可能阻塞的方法,包括
Thread.Join
、Thread.Sleep
、WaitHandle.WaitOne
等
由于您希望工作线程在关闭窗体时终止,因此我建议在停止信号发送到工作线程后让窗体关闭。添加一个线程。在调用应用程序后,加入对应用程序入口点的调用。运行。由于您正在关闭应用程序,因此如果线程没有及时响应,可以安全地调用Thread.Abort
。下面是一些示例代码
public void Main(string[] args)
{
var form = new YourForm();
Application.Run(form);
if (!form.WorkerThread.Join(TIME_TO_WAIT))
{
form.WorkerThread.Abort();
}
}
不幸的是,这是我们需要.NET4.0的第一个项目,因此我目前正在使用VS2010 Express。看起来它没有用于调试的线程窗口。感谢Brian Gideon,我确实测试了您的解决方案,但我的主窗体将立即关闭。问题是我并不真正理解您的解决方案,也不确定我是否以正确的方式实现了它。基本上,我现在只调用Stop()来设置窗体关闭事件中工作线程的停止标志。我认为在这一点上,我的主窗体将被关闭,执行将返回到program.cs的行:if(!Form.WorkerThread.Join(TIME_to_WAIT)),但由于主窗体在那一点上关闭,并且似乎记录器函数在那一点上也不工作,我如何知道从那一点上发生了什么?
public void Main(string[] args)
{
var form = new YourForm();
Application.Run(form);
if (!form.WorkerThread.Join(TIME_TO_WAIT))
{
form.WorkerThread.Abort();
}
}