2016-09-06 4 views
0

私はルビーの背景です。私はプロジェクトをC#に移行する必要があります。何千ものAPI呼び出しを行います。ルビーではTyphoeus Hydraを使ってリクエストをパラレルに実行し、レスポンスを並列に実行します。C#でapi呼び出しを実行し、その応答を並列実行するには?

注:各api呼び出しは、呼び出しごとに独立しています。

ルビーのテンプレートは、私は非同期で動作するように持っており、C#で(TPL)を待つ少し考えを持っているこの

#typhoeus gem used to make api call 
QUEUE = Typhoeus::Hydra.new 
[1..100].each do |val| 
    request = Typhoeus::Request.new("http://api.com/?value=#{val}") 
    request.on_complete do |response| 
    # code to be executed after each call 
    end 
    QUEUE.queue(request) 
end 

#run the queue will run 100 api calls in parallel and execute complete block in parallel 
QUEUE.run 

のようになります。しかし、私は参考になる良い例が必要です。事前に

おかげで

答えて

1

寿はパラレルLINQライブラリ(PLINQ)を見ている必要があります。

あなたはこのように要求を行うことができます。

Parallel.ForEach(Enumerable.Range(1, 100), (val) => 
{ 
    // make syncron api call 
    WebClient webClient = new WebClient(); 
    var result = webClient.DownloadString(string.Format("http://api.com/?value={0}", val); 
    // work on the result 
}); 
+0

私はこの角度でも働かせてくれてありがとう。 – Praveenkumar

1

並列処理はオプションです。ただし、スレッドを不必要にブロックします。あなたの操作はI/Oバウンド(HTTP APIを打つ)なので、非同期の同時実行がより良い選択です。あなたは同時にすべてそれらを実行したい場合は、シンプルなTask.WhenAllは十分であろう

private static HttpClient client = new HttpClient(); 
private static async Task DownloadAndProcessAsync(string value) 
{ 
    var response = await client.GetStringAsync($"http://api.com/?value={value}"); 
    // Process response. 
} 

var source = Enumerable.Range(1, 100); 
var tasks = source.Select(v => DownloadAndProcessAsync(v.ToString())); 
await Task.WhenAll(tasks); 

まず、あなたの "ダウンロードおよびプロセス" 操作を定義したいですasync/awaitの詳細については、intro to async blog post(およびその最後のリソース参照)を参照してください。

関連する問題