2011-02-09 66 views
2

我在WPF中编写应用程序。我有一个主线程和另一个主线程 - 我计算了一些东西。在主线程中,我需要在完成附加线程后执行一个操作。我无法使用Join作为附加线程,因为我不想阻塞主线程。我如何等待完成第二个线程,同时不要阻塞主线程?WPF中的线程问题

回答

3

最简单的方法是使用backgroundworker并处理RunWorkerCompleted事件。

我也邀请您参加的 约瑟夫阿尔巴哈利的Threading in C# pdf

+0

嗯,我想这不会是最好的解决办法。我想取消这个额外的线程,当我点击取消按钮。我知道后台工作者有CancelAsync()方法,但是应该在后台工作者中完成的方法是独立运行的。我的意思是在这个函数中我没有可以打破的循环,但我只是调用一个系统函数来优化,我不能打破它。 – ravenik

+0

@ravenik。不管您选择哪种解决方案,您是否都有这个问题? 'if(_bw.CancellationPending){e.Cancel = true;返回; }'设置'e.result'足够给你吗? –

2

另一种简单的方法来看看第3部分是使用任务并行库和链中的多个任务,continuations

虽然它不能免除你@康拉德的建议:请阅读the threading book。这很吸引人,而且完全值得努力。

+0

@Anvanka +1延续是一个非常好的选择 –

0

如果你创建你自己的线程,有工作线程调用回调方法时,它的完成:

public delegate void DoneDelegate (object calculationResults); 
public class MyWorker 
{ 
    public DoneDelegate Done { get; set; } 
    public void Go() 
    { 
     object results = null; 
     // do some work 
     Done(results); 
    } 
} 

public class Main 
{ 
    public void StartWorker() 
    { 
     MyWorker worker = new MyWorker(); 
     worker.Done = new DoneDelegate(DoneCallback); 
     System.Threading.Thread thread = new System.Threading.Thread(worker.Go); 
     thread.IsBackground = true; 
     thread.Start(); 
    } 
    public void DoneCallback (object results) 
    { 
     // use the results 
    } 
}