我有一个WebClient(WP8)的扩展方法
public static Task<string> DownloadStringTask(this WebClient webClient, Uri uri)
{
var tcs = new TaskCompletionSource<string>();
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中等待。
有什么想法吗?
提前致谢。
答案 0 :(得分:1)
是否从主线程执行GetResult
?在这种情况下,它可能是一个僵局。如果我没记错的话,WebClient
的回调是在主线程上执行的,这不会发生,因为你通过调用task.Result
来阻止它。
您有多种方法可以防止此问题:
使用HttpWebRequest
代替WebClient
从另一个帖子中调用GetResult
使用task.ContinueWith
而非直接task.Result
使用async / await keywords重写您的方法
答案 1 :(得分:0)
task.Result
阻止正在执行的线程,直到结果可用。对我来说,似乎你的代码只是失败了使请求异步的目的。正如KooKiz所提到的,使用一些真正的异步API来获取结果,例如task.ContinueWith
或await task
。