C#:Thread.Join()冻结了UI

时间:2015-11-05 12:02:08

标签: c# multithreading thread-safety

每当点击一个按钮时,我想优雅地停止无休止的循环线程运行。以下是我理解应该工作的内容:

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解决了这个问题。

2 个答案:

答案 0 :(得分:1)

由于您没有提及其他情况,我认为running未声明为volatile,这意味着threadWorker()方法无法检查它{&#39}&#34 ;实"值,但是它的缓存值。尝试将其声明为

volatile bool running;

答案 1 :(得分:1)

  

工作线程似乎停留在调用以更新图表。

worker尝试通过调用访问UI线程。但是UI在Join中等待。这是一个僵局。

与UI结合的

Thread已过时。切换到使用await,这些问题就会消失。