首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

当调用异步方法时,怎么向主线程返回值

2013-06-26 
当调用异步方法时,如何向主线程返回值?如有下面一段代码private StreamRead(String FileName){Uri mainUri

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


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));

热点排行