WP8 TaskCompletionSource没有得到结果

时间:2013-05-23 08:03:43

标签: c# windows-phone-8 webclient taskcompletionsource

我有一个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中等待。

有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

  • 使用HttpWebRequest代替WebClient

  • 从另一个帖子中调用GetResult

  • 使用task.ContinueWith而非直接task.Result

  • 异步执行任务
  • 使用async / await keywords重写您的方法

答案 1 :(得分:0)

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