2014-07-11 133 views
0

有這個線程具有相同的名稱,但不同的目的 Threading - make sure the thread finishes線程 - 確保線程完成在C#

這是得到了使用+ =連接到事件的方法。

public void MsgBox(Int i, Int j) 
{ 
    MessagBox.Show ("a"); 
    MessagBox.Show ("b"); //it was not MessageBox.Show ("b") in the original code. 
    // It was something that is more time consuming for the computer 
} 

我會得到消息框的值a,a,a,b,b,b

做一些調試後,我意識到以前MessageBox.Show("b")可以調用,事件調用另一個MSGBOX實例從而導致a,a,a,b,b,b

+0

你可以sh是你創建線程的部分嗎? – bit

+0

你想要發生什麼? –

+0

notifiable.Onevent1 + =(o,e)=> {MsgBox(o.a,o.b); }; – user3398315

回答

0

MessagBox.Show ("a");是阻塞代碼這將等待用戶交互,而其他線程正在做一些事情。所以請使用Console應用程序來了解線程是如何工作的。

+0

我試着刪除MessageBox.Show(「a」)和MessageBox.Show(「b」 )並嘗試運行代碼。仍然是相同的結果,在線程完成之前,編譯器啓動一個新的線程 – user3398315

+0

可以分享你如何創建線程 –

+0

@KB你的意思是?通知.Onevent1 + =(o,e)=> {MsgBox(o.a,o.b); }; 。對不起,我是一個新手程序員,這不是我的代碼 – user3398315

1

我想你想擁有syncronisation多個線程之間,使你得到一個輸出像

"ab ab ab" 

而不是

"aa ab bb" or "aa ba bb" or "ab aa bb" ... 

爲此,您可以添加一個普通的鎖,讓所有的線程試圖獲得相同的鎖

// make sure there is only 1 instance of _obj shared between all threads 
// one approach to do this would be to use a static object 
private static object _obj = new object(); 

public void MsgBox(Int i, Int j) 
{ 
    lock(_obj) 
    { 
     MessagBox.Show ("a"); 
     Thread.Sleep(1000); // simulate work 
     MessagBox.Show ("b"); 
    } 
} 
+0

可能是你猜對了+1正在等待OP糾正他aswer –

+0

感謝這聽起來像一個好主意,但它不工作。我剛剛嘗試了一分鐘前 – user3398315

+0

爲什麼不工作可以更明確? –