Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:Thread.Join()冻结用户界面_C#_Multithreading_Thread Safety - Fatal编程技术网

C#:Thread.Join()冻结用户界面

C#:Thread.Join()冻结用户界面,c#,multithreading,thread-safety,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 se

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

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

既然您没有提到其他问题,我想
running
并没有声明
volatile
,这意味着
threadWorker()
方法不会检查它的“真实”值,而是它的缓存值。试着把它声明为

volatile bool running;
工作线程似乎在调用更新图表时卡住了

工作线程试图通过调用访问UI线程。但是用户界面在
加入时被卡住了。这是一个僵局


线程
与UI结合使用已过时。切换到使用
wait
,这样问题就会消失。

您试过调试工作循环吗?我对这方面很陌生,我该如何调试工作循环?我正在使用Visual Studio 2015社区。冻结时的“全部中断”显示它在myThread.Join()上被卡住,“running”标志为false,这是应该的。@iHavenoidawhati正在使用线程窗口切换到其他线程。它很忙,没有退出。这就是Join未完成的原因。不确定应该切换到什么。至少有两个线程。切换到另一个,以便可以看到其堆栈。需要调查threadWorker正在做什么。你是对的,我没有将其声明为volatile。然而,添加volatile并没有帮助,用户界面仍然冻结。