日期:2014-05-17  浏览次数:20757 次

当调用异步方法时,如何向主线程返回值?
如有下面一段代码

private Stream  Read(String FileName)
{
      Uri mainUri = new Uri(FileName, UriKind.Relative);
      WebClient webClient = new WebClient();
      webClient.OpenReadCompleted += webClient_OpenReadCompleted;
      webClient.OpenReadAsync(mainUri);
}

private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
      Stream mainXapStream = e.Result;
}

怎么将 mainXapStream 返回到方法Read中?

------解决方案--------------------
C# 5.0很简单
Uri mainUri = new Uri(FileName, UriKind.Relative);
WebClient webClient = new WebClient();
Stream mainXapStream = await webClient.OpenReadAsync(mainUri);
------解决方案--------------------
mainXapStream  定义为成员方法。在read中要使用之前,先wait一下。在webClient_OpenReadCompleted完成后,set下


ManualResetEvent wait = new ManualResetEvent(false);
 
private Stream  Read(String FileName)
{
      Uri mainUri = new Uri(FileName, UriKind.Relative);
      wait.reset(); //复位
      WebClient webClient = new WebClient();
      webClient.OpenReadCompleted += webClient_OpenReadCompleted;
      webClient.OpenReadAsync(mainUri);
      wait.WaitOne(); //等待完成
}
 
private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
      Stream mainXapStream = e.Result;
      wait.set(); //通知完成
}
 

------解决方案--------------------
可以使用Task
Task<Stream> One=new new Task<Stream>(...);
One.Start();
Task two = One.ContinueWith(task => Console.WriteLine("The result is: {0}", One.Result));