【问题标题】:Run HttpClient POST in parallel并行运行 HttpClient POST
【发布时间】:2016-12-07 16:53:11
【问题描述】:

我正在使用 .net HTTPClient 使用 POST REST API 保存一些数据。此 API 的有效负载大小约为 10 MB。我将我的数据分成块并为每个块调用这个 POST API。我主要对方法有疑问:

  1. 我计划创建 HTTPClient 的单个静态实例,并将跨应用程序使用相同的实例。我的方法应该是什么? (为每个块 POST API 调用创建单例或新客户端)

  2. 我想并行调用所有这些块 POST 调用(在 .net 中使用 TASKS)。如果任何一项任务失败,是否有任何方法可以停止剩余任务。我正在寻找一些示例代码。

    _factory = new TaskFactory();
    _factory.StartNew(() =>
                //Call to async POST API using HttpClient                   
             ).ContinueWith((response) =>
                   {
                       if (!response.IsFaulted)
                       {
                          //Do something
                       }
                       else {
                           this._logger.Error("log the error");
                       }
                   });
    

【问题讨论】:

标签: c# .net task dotnet-httpclient


【解决方案1】:
  1. 如果您的调用都发往同一主机,请使用共享的 HttpClient 实例。

  2. 无需使用TaskFactory.StartNew 显式创建任务即可并行执行I/O 密集型异步工作。我建议使用Task.WhenAll。像这样的:

    try {
        await Task.WhenAll(chunks.Select(MakeCall));
    }
    catch (Exception) {
        _client.CancelPendingRequests();
    }
    
    
    private async Task MakeCall(string chunk) {
        var response = await _client.PostAsync(chunk);
        if (!response.IsFaulted) {
            //Do something
        }
        else {
            this._logger.Error("log the error");
            throw new Exception("call failed!");
        }
    }
    

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2011-07-28
    • 2021-01-11
    • 1970-01-01
    • 2018-01-12
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多