2016-12-07 30 views
1

POST REST APIを使用して一部のデータを保存するために.net HTTPClientを使用しています。このAPIのペイロードサイズは約10 MBです。私はチャンクで自分のデータを分割し、各チャンクに対してこのPOST APIを呼び出す。私は、ほとんどのアプローチに関して質問をしています:HttpClient POSTを並列に実行する

  1. 私はHTTPClientの単一の静的インスタンスを作成する予定であり、アプリケーション全体で同じインスタンスを使用します。私のアプローチは何ですか?

  2. これらのチャンクPOSTコールはすべて、(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に設定ブール変数。他のタスクは、その変数をチェックし、必要に応じて停止することができます。 – 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!"); 
        } 
    } 
    
関連する問題