WP8 TaskCompletionSource没有得到结果

我有一个WebClient的扩展方法(WP8)

public static Task DownloadStringTask(this WebClient webClient, Uri uri) { var tcs = new TaskCompletionSource(); webClient.DownloadStringCompleted += (s, e) => { if (e.Error != null) { tcs.TrySetException(e.Error); } else if (e.Cancelled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(e.Result); } }; webClient.DownloadStringAsync(uri); return tcs.Task; } 

并调用此方法

 public string GetResult() { var task = new WebClient().DownloadStringTask(new Uri("http:\\www.foo.com")); return task.Result; } 

DownloadStringCompleted永远不会被执行,显然没有结果,如果我按下VS上的暂停按钮总是在task.Result中等待。

任何的想法?

提前致谢。

GetResult是从主线程执行的吗? 在这种情况下,它可能是一个僵局。 如果我没记错的话, WebClient的回调是在主线程上执行的,这不会发生,因为你通过调用task.Result来阻止它。

您有多种方法可以防止此问题:

  • 使用HttpWebRequest而不是WebClient

  • 从另一个线程调用GetResult

  • 使用task.ContinueWith而不是直接task.Result异步执行任务

  • 使用async / await关键字重写您的方法

task.Result阻塞执行线程,直到结果可用。 对我来说,似乎你的代码只是失败了使请求异步的目的。 正如KooKiz所提到的,使用一些真正的异步API来获取结果,例如task.ContinueWithawait task