0

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

任何想法?

提前致谢。

4

2 回答 2

1

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

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

  • 使用 aHttpWebRequest而不是 aWebClient

  • GetResult从另一个线程调用

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

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

于 2013-05-23T08:11:52.890 回答
0

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

于 2013-05-23T15:54:26.153 回答