2015-11-05 106 views
0

我想优雅地停止无处不在的循环线程,无论何时单击按钮时运行。以下是据我所知应该工作: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解决了这个问题。

+0

你有没有试过调试你的工作循环? – AntiHeadshot

+0

我在这方面很新颖,究竟如何进行调试工作?我正在使用Visual Studio 2015社区。 “冻结所有”在冻结时显示它被卡在myThread.Join()上,并且“运行”标志为false,因为它应该是这样。 –

+0

@ Ihavenoideawhat我正在使用线程窗口切换到另一个线程。它很忙,不会退出。这就是Join没有完成的原因。 – usr

回答

1

工作者线程似乎在调用被卡住更新图表。

工作人员试图通过调用访问UI线程。但用户界面卡在Join等待中。这是一个僵局。

Thread与UI一起已过时。切换到使用await,这样的问题就消失了。

1

由于您没有提到其他方面,我认为running没有声明volatile这意味着threadWorker()方法不检查它的“真实”的价值,但它的缓存值。尝试声明为

volatile bool running; 
+0

你是对的,我没有宣布它是不稳定的。但是添加volatile会失效,UI仍会冻结。 –