有几种方法可以做到这一点,新版本的 DotNet 在旧版本的基础上构建以提供更简单的功能和语法。
首先你可以启动一个线程并同步直到它发生(这个例子是阻塞的)
MyResult myResult = null;
ManualResetEvent synchronizer = new ManualResetEvent();
public void Caller()
{
new Thread(new ThreadStart(CalculateResult)).Start();
synchronizer.WaitOne();
DoSomethingWith(myResult);
}
public void CalculateResult()
{
myResult = ResultOfSomethingThatTakesAWhile();
synchronizer.Set();
}
或者您可以使用 DotNet 2.0 中的 BackgroundWorker
MyResult myResult = null;
var worker = new BackgroundWorker();
worker.DoWork += (Action)(()=> { myResult = ResultOfSomethingThatTakesAWhile();});
worker.RunWorkerCompleted += (Action)(()=> DoSomethingWith(myResult));
使用 DotNet 4.0 中的 TPL,您现在可以使用任务(同样,这个示例是阻塞的)
var t = Task.Run(() => { return ResultOfSomethingThatTakesAWhile(); });
t.Wait();
DoSomethingWith(t.Result);
或者您可以将 async 与 DotNet 4.5 一起使用
var myResult = await Task.Run(()=> ResultOfSomethingThatTakesAWhile());
DoSomethingWith(myResult);
最后,如果您并不真正关心将结果返回给原始线程,而只是想将结果处理到 UIThread 上,那么您可以使用这些方法中的任何一个来调用新线程,然后调用
Dispatcher.Invoke(()=> DoSomethingWith(myResult));
或者
WinFormsControl.Invoke(()=> DoSomethingWith(myResult));