如何在c#中运行api调用并并行执行它们的响应

本文关键字:并行执行 响应 调用 api 运行 | 更新日期: 2023-09-27 18:05:55

我来自ruby背景。我有一个项目需要迁移到c#。它将调用数千个api服务。在ruby中,我使用Typhoeus Hydra并行运行请求并并行执行响应。

注意:每个api调用是独立的,每个调用之间没有依赖关系。

ruby的模板是这样的

#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#中使用async和await (TPL)。但是我需要一些有帮助的好例子。

Thanks in advance

如何在c#中运行api调用并并行执行它们的响应

你应该看看并行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博客文章的介绍(以及末尾的后续资源)。