在GetAsync上使用await时,HttpClient不会抛出异常

mbu*_*ill 5 c# task-parallel-library async-await

我正在使用以下代码获取端点并将其写入缓存:

public async Task UpdateCacheFromHttp(string Uri)
{
    if (string.IsNullOrEmpty(Uri))
        return;

    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(Uri);

    if ((response != null) && (response.IsSuccessStatusCode))
    {
        var responseStream = await response.Content.ReadAsStreamAsync();
        WriteToCache(responseStream);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码在IIS上运行.

如果无法访问端点,我希望GetAsync抛出异常.即使使用Try-Catch,它也似乎永远不会失败.GetAsync永远不会返回(我在HttpClient上尝试了5秒的超时,仍然没有返回).

这会引发异常:

public Task UpdateCacheFromHttp(string Uri)
{
    var updateCacheTask = Task.Factory.StartNew(new Action(() =>
    {
        if (string.IsNullOrEmpty(Uri))
            return;

        var httpClient = new HttpClient();
        var response = httpClient.GetAsync(Uri).Result;

        if (response.IsSuccessStatusCode)
        {
            var responseStream = response.Content.ReadAsStreamAsync().Result;
            WriteToCache(responseStream);
        }
    }));

    return updateCacheTask;
}
Run Code Online (Sandbox Code Playgroud)

我得到了预期的"无法连接到远程服务器".

我怀疑它与IIS中运行的代码有关,但为什么呢?如何在不需要启动新任务的情况下正确抛出异常?

Ste*_*ary 15

我的直觉告诉我你正在调用WaitResult进一步调用你的调用栈.

如果这是正确的,那么你正在造成僵局,正如我在博客上解释的那样.