我正面臨着C#.NET應用程序中的線程間通信問題。 希望有人會指導我關於可能的解決方案的正確方向。C#.NET線程問題
我在C#.NET中有一個應用程序。它是一個Windows窗體應用程序。 我的應用程序有兩個線程 - 一個線程是主線程(UI線程),另一個線程是子線程。讓子線程調用「workerThread」 應用程序中只有一種形式。我們稱之爲「MainForm」形式。
子窗口線程在MainForm加載時啓動(使用窗體的「Load」事件處理函數啓動線程)
在MainForm類,我有一個變量命名爲「限緊」,這是一個公共布爾變量,它作爲一個標誌,指示子線程是否應該繼續工作,還是應該停止
我有另一個類(除了MainForm類),它包含我在子線程中執行的方法。讓我們稱這個第二類爲「WorkerClass」。 我傳遞到當前書(MainForm的)的引用進入「WorkerClass」
我具有其中設置「限緊」如果點擊的,然後爲「true」的主要形式的按鈕「停止」的構造調用「workerThread.Join()」來等待子線程完成執行。
在子線程中,方法「doWork」不斷檢查內的「parentForm.stopWork」的狀態以瞭解循環。如果「stopWork」設置爲「true」,則循環會中斷,然後該方法結束。
現在,問題是,一旦我點擊「停止」按鈕,應用程序就會掛起。
我下面的代碼粘貼部位,使其更易於理解:
public partial class MainForm : Form
{
Thread workerThread = null;
ThreadStart workerThreadStart = null;
WorkerClass workerClass = null;
public bool stopWork = true;
/*.......... some code ............*/
private void MainForm_Load(object sender, EventArgs e)
{
workerThreadStart = new ThreadStart(startWork);
workerThread = new Thread(workerThreadStart);
stopWork = false;
workerThread.Start();
}
private void startWork()
{
workerClass = new WorkerClass(this);
}
private void buttonStop_Click(object sender, EventArgs e) //"stop" button
{
if (workerThread != null)
{
if (workerThread.IsAlive == true)
{
stopWork = true;
workerThread.Join();
}
}
}
/*.......... some more code ............*/
}
public class WorkerClass
{
MainForm parentForm=null;
/*......... some variables and code ........*/
public WorkerClass(MainForm parentForm)
{
this.parentForm=parentForm;
}
/* .............. some more code ...........*/
public void doWork()
{
/*.......... some variables and code ...........*/
for(int i=0;i<100000;i++)
{
// ** Here is the check to see if parentForm has set stopWork to true **
if(parentForm.stopWork==true)
break;
/*......... do some work in the loop ..........*/
}
}
/********* and more code .........*/
}
我想我可能知道問題所在。 問題出在試圖通過調用「workerThread.Join()」方法阻止父表單時訪問父表單中的「stopWork」變量的子線程中的「doWork」方法。所以,我認爲這是一個「僵局」問題。
我正確地發現問題嗎?還是我錯了,問題在於別的地方?
如果這確實是一個僵局,那麼有什麼可能的解決方案來解決這個問題?
我做了一些谷歌上搜索,發現大量的資源在線程同步以及如何避免死鎖。但我不明白如何將它們專門應用於我的問題。
我真的很感謝任何關於解決這個問題的幫助或指導。
我想查看你的工作線程類的一部分,看看它是如何檢測是否已經請求了停止工作。你能包括嗎? – BugFinder 2011-04-02 11:49:35
你是從線程更新GUI嗎? – 2011-04-02 15:00:15
@Lasse V. Karlsen:是的,我正在從子線程更新GUI。我在富文本框控件上調用Invoke以將消息寫入UI。 – sandyiscool 2011-04-02 15:19:26