读书人

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

发布时间: 2013-06-26 14:29:32 作者: rapoo

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


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

读书人网 >C#

热点推荐