WP8 TaskCompletionSource没有得到结果

本文关键字:结果 TaskCompletionSource WP8 | 更新日期: 2023-09-27 18:14:53

我有一个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.

任何想法?

WP8 TaskCompletionSource没有得到结果

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

你有多种方法来防止这个问题:

  • HttpWebRequest代替WebClient

  • 从另一个线程调用GetResult

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

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

task.Result阻塞正在执行的线程,直到结果可用为止。对我来说,您的代码似乎违背了使请求异步的目的。正如KooKiz所提到的,使用一些真正的异步API来获得结果,例如task.ContinueWithawait task