2017-03-24 12 views
1

どのようにしてC#を使用して複数のWebサービスを同時に呼び出すことができますか?C# - 同時にWebサービスを呼び出し、スロットルで非同期にする

私は顧客のテーブルを持っています(約100万人)、私は5,000人の顧客のバッチを持つWebサービスに電話して情報を返し、ファイルに書き込む必要があります。

私はasync/awaitとTPL Dataflowライブラリを使用しようとしましたが、コードは普通の古い同期メソッドを使用するよりも非常に遅いです。以下は私が達成しようとしていることの要約です。コードは、非同期とマークすることができないコンソールアプリケーション(メインメソッド)から実行されます。

public void GenerateCustomerFile(){ 

    var outputFileName = "MyCustomerFile.txt"; 
    var customers = CustomerRepo.GetCustomers(); 
    var customerBatch = new List<Customer>();  

    foreach(var customer in customers){ 

     customerBatch.Add(customer); 

     if(customerBatch.Count >= 20000){ 
      // Call web service concurrently (4 threads with 5000 customers each) 
      // Write results to file 
      customerBatch.Clear(); 
     } 
    } 
} 

答えて

0

なぜこのループを使用していますか?あなたはちょうど私がhttpリクエストのためFlurlを使用しています、これを分割し、5K

var customerBatch = CustomerRepo.GetCustomers(); 
const int batchSize = 5000; 
var sendingTasks = Enumerable.Range(0,(customerBatch.Length/batchSize)).Select(async a=>{ 
    var section = customerBatch.Skip(a*batchSize).Take((a+1)*batchSize); 
    await "https://lolcow.com/api/entity".PostJsonAsync(section); 
}); 
await Task.WhenAll(sendingTasks); 

のバッチを送信することができ、あなたはこれがあなたがやっている何をすべきthis..butのために使用していたかわかりませんでした...もしそれらのすべてを行うよりも遅いなら、バッチを大きくする必要があります。

主なメソッドと非同期についての質問は、通常はメインの非同期を作成し、それをmain方法

public static async Task MainAsync(string[] args) 
{ 
    //do stuff here 
} 

public static void Main(string[] args) 
{ 
    MainAsync(args).Wait(); 
} 
+0

これを試してみます。メインのメソッドからこの非同期コードを呼び出すのはどうですか?デッドロックを起こさずにどうしていますか? – user2966445

+0

この場合、実際にタスク数をどのように制限していますか? 100万のレコードがある場合、これは200の並行タスクを開始しませんか? – user2966445

+0

いいえ、それは、タスクの処理方法を最適化すべきではありません。これがあなたの主な方法にある場合、非同期メソッドタスクを作成し、それを待つことをお勧めします – konkked

関連する問題