2015-11-05 148 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仍會凍結。 –