我想优雅地停止无处不在的循环线程,无论何时单击按钮时运行。以下是据我所知应该工作:C#:Thread.Join()冻结UI
bool running = true;
private Thread myThread = new Thread(new ThreadStart(threadWorker));
private void threadWorker()
{
while(running)
{
...
}
}
private void button_click(object sender, EventArgs e)
{
running = false
myThread.Join();
...
}
但是,单击按钮冻结UI线程。暂停程序调试显示它停留在Thread.Join()。如果我将“运行”标志放在一个单独的按钮上并在加入之前单击它,那么它可以正常工作,但这种方式就好像该标志永不改变,方法永远不会结束。
我在做什么错?
编辑:这个问题不是“为什么在启动/停止线程后CPU使用率不断增加?”,将“volatile”添加到标志声明并不能解决问题。
在我的情况下,程序冻结了UI更新调用(感谢usr告诉我我可以检查其他线程正在做什么)。用Control.BeginInvoke
代替Control.Invoke
解决了这个问题。
你有没有试过调试你的工作循环? – AntiHeadshot
我在这方面很新颖,究竟如何进行调试工作?我正在使用Visual Studio 2015社区。 “冻结所有”在冻结时显示它被卡在myThread.Join()上,并且“运行”标志为false,因为它应该是这样。 –
@ Ihavenoideawhat我正在使用线程窗口切换到另一个线程。它很忙,不会退出。这就是Join没有完成的原因。 – usr