2012-02-29 60 views
2

好了,所以我有一個很難搞清楚如何等待線程與不結冰的窗戶形式的代碼一起繼續之前完成..與Windows線程麻煩形成

示例代碼:

var ct = new System.Threading.Thread(solve); 
ct.IsBackground = true; 
ct.Name = "Solving"; 
//start our thread 
ct.Start(); 
ct.Join(); 
label33.Invoke((MethodInvoker)delegate { label33.Text = "Submitting..."; }); 
clickPost("name", textBox27.Text); 

回答

1

ct.Join()的調用只有一個目的 - 阻止有問題的線程完成。

如果您不想阻止,則需要通過其他一些機制(如事件)處理完成背景「工作」的通知。

通過使用BackgroundWorker(爲正確的用戶界面線程提供通知),可以極大地簡化Windows窗體的操作。

0

如果我正確理解你,你需要的是爲某些異步操作創建回調。 您可以使用委託的BeginInvoke回調參數。請記住代理和它的回調將在自己的線程中執行:

Action backgroundAction = new Action(DoAction); 
backgroundAction.BeginInvoke(ActionCallback, null); 

private void DoAction() 
{ 
    //some background task 
} 

private void ActionCallback(IAsyncResult result) 
{ 
    //will be executed after 
} 
+0

不應該在某處調用'EndInvoke'嗎? – 2012-02-29 07:20:13

+0

如果您需要從DoAction()獲得一些結果,可以使用EndInvoke。在我的示例DoAction()聲明爲void。如果您使用另一個具有返回值的委託,那麼獲得此結果的唯一方法是使用EndInvoke。 – 2012-02-29 08:00:58

+0

或者如果被調用的代碼需要清理,或者如果它想拋出異常... – 2012-02-29 08:02:28