【问题标题】:How to run api calls and execute their response parallel in c#?如何在 c# 中运行 api 调用并并行执行它们的响应?
【发布时间】:2016-09-06 21:45:34
【问题描述】:

我来自红宝石背景。我有一个项目需要迁移到 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)。但我需要一些有用的好例子。

提前致谢

【问题讨论】:

    标签: c# ruby parallel-processing


    【解决方案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
    });
    

    【讨论】:

    • 感谢您的建议,让我也从这个角度工作。
    【解决方案2】:

    并行处理是一种选择;但是,它会不必要地阻塞线程。由于您的操作受 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的更多信息,请参阅我的intro to async blog post(以及它末尾的后续资源)。

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 2019-01-17
      • 1970-01-01
      • 2012-09-14
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多