簡體   English   中英

如何在C#中並行運行api調用並執行其響應?

[英]How to run api calls and execute their response parallel in c#?

我來自紅寶石背景。 我有一個項目需要遷移到C#。 它將進行數千次api服務調用。 在ruby中,我使用Typhoeus Hydra並行運行請求並並行執行響應。

注意:每個api調用是分開的,每個調用之間沒有依賴關系。

紅寶石的模板將像這樣

#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

我幾乎不知道我必須在c#中使用異步並等待(TPL)。 但是我需要一些很好的例子,這將有所幫助。

提前致謝

Shou應該看看Parallel 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
});

並行處理是一種選擇; 但是,它不必要地阻塞線程。 由於您的操作是I / O綁定的(點擊HTTP API),因此異步並發是一個更好的選擇。

首先,您將定義“下載並處理”操作:

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.
}

如果你想同時運行所有這些,那么一個簡單的Task.WhenAll就足夠了:

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

有關async / await更多信息,請參閱async博客文章簡介 (及其末尾的后續資源)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM