当一个请求超时时,HttpClient并行请求使用Task.WhenAll超时

时间:2019-07-09 12:27:48

标签: c# task dotnet-httpclient

我使用一个httpclient发出约20个http get请求,这个httpclient寿命很长,这意味着它没有打包到using语句中。由于Web服务通常非常快(响应时间约为200毫秒),因此我将超时设置为5秒。

现在我遇到了问题,如果一个请求遇到超时,所有其他请求都将被取消。这是正常行为吗?

这是我用来进行一致调用的代码

public async Task GetAll()
{
    await Task.WhenAll(x => x.Select(xx => GetData(xx.Id));
}

调用api的代码:

    public async Task GetData(int id)
    {
        string payload = "";
        try
        {
            var resp = await base.GetAsync($"/apis/v2/getdata/{id}");
            if (!resp.IsSuccessStatusCode)
                Console.WriteLine("Error");

            payload = await resp.Content.ReadAsStringAsync();
            Console.WriteLine(payload);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("Error");
        }
    }

我的基本HttpClient类

public class MyHttpClient : System.Net.Http.HttpClient
{
    public Logger Log  { get; set; }
}

如果我按顺序运行任务,那么一切正常,但是当我并行运行它们并且一个任务运行超时时,所有其他未完成的任务将被取消。

1 个答案:

答案 0 :(得分:1)

  

如果提供的任何任务以故障状态完成,则返回的任务也将以“故障”状态完成,其中其异常将包含每个提供的任务中未包装的异常集的集合。

来源:https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=netframework-4.8