每当点击一个按钮时,我想优雅地停止无休止的循环线程运行。以下是我理解应该工作的内容:
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()上。如果我将“running”标志放在一个单独的按钮上并在加入之前单击它然后它工作正常,但这样就好像标志永远不会改变,因为方法永远不会结束。
我做错了什么?
编辑:这个问题不是“为什么在启动/停止线程后CPU使用率不断增加?”的重复,在标志声明中添加“volatile”并没有解决问题。
在我的情况下,程序在UI更新调用时冻结(感谢usr告诉我我可以检查其他线程正在做什么)。用Control.Invoke
替换Control.BeginInvoke
解决了这个问题。
答案 0 :(得分:1)
由于您没有提及其他情况,我认为running
未声明为volatile
,这意味着threadWorker()
方法无法检查它{&#39}&#34 ;实"值,但是它的缓存值。尝试将其声明为
volatile bool running;
答案 1 :(得分:1)
工作线程似乎停留在调用以更新图表。
worker尝试通过调用访问UI线程。但是UI在Join
中等待。这是一个僵局。
Thread
已过时。切换到使用await
,这些问题就会消失。