2016-12-07 25 views
1

我正在使用.net HTTPClient使用POST REST API保存一些數據。該API的有效載荷大小約爲10 MB。我將數據分塊併爲每個塊調用此POST API。我主要有問題的方法:並行運行HttpClient POST

  1. 我打算創建HTTPClient的單個靜態實例,並將跨應用程序使用相同的實例。我應該怎麼做? (爲每個塊POST POST調用創建單例或新客戶端)

  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"); 
            } 
           }); 
    
+0

也許你設置爲true/false的布爾變量。其他任務可以檢查該變量並在必要時停止。 – SpiderPig

+0

您也可以使用取消令牌來執行此操作。以下是一些示例代碼https://msdn.microsoft.com/en-us/library/dd321955(v=vs.110).aspx,此外,HTTPClient還有一個取消所有未決請求的方法。 https://msdn.microsoft.com/en-us/library/system.net.http.httpclient.cancelpendingrequests(v=vs.118).aspx – SpiderPig

回答

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!"); 
        } 
    }