2012-02-29 36 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