5

我有以下代码

static void Main(string[] args)
{
        string url = "http://www.google.com";
        Console.WriteLine(GetUrl(url).Result); // throws TaskCanceledException
        Console.WriteLine(GetUrl2(url).Result);
    }

    public static Task<string> GetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            return client.GetStringAsync(url);
        }
    }

    public static Task<string> GetUrl2(string url)
    {
        using (var client = new WebClient())
        {
            return client.DownloadStringTaskAsync(url);
        }
    }

我正在尝试获取 url 的字符串,问题是 GetUrl 方法(使用 HttpClient 的 GetStringAsync)引发了 TaskCacelledException,但 GetUrl2 方法(使用 WebClient 的 DownloadStringTaskAsync)运行正常。这是由于using statement? 我错过了什么?

编辑。在此示例中,我在任务上调用 Result 因为这是一个控制台应用程序,我知道最好在事件处理程序中等待结果。

4

1 回答 1

9

这是由于 using 语句引起的吗?

是的。在这两个代码示例中,您都是在操作完成之前处置底层客户端。两个代码示例都应该这样更改:

public static async Task<string> GetUrlAsync(string url)
{
    using (var client = new HttpClient())
    {
        return await client.GetStringAsync(url);
    }
}

public static async Task<string> GetUrl2Async(string url)
{
    using (var client = new WebClient())
    {
        return await client.DownloadStringTaskAsync(url);
    }
}

处置其底层客户端时的异步下载行为未记录。在您的代码使用完它们之前,最好不要释放客户端。

于 2014-12-19T18:25:32.763 回答