2016-09-06 43 views
0

我来自ruby背景。我有一个项目需要迁移到C#。它将进行数千次api服务电话。在ruby中,我使用Typhoeus Hydra并行执行请求并执行并行响应。如何运行API调用并在c#中并行执行它们的响应?

注意:每个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)知之甚少。但我需要一些很有用的例子。

在此先感谢

回答

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),异步并发是更好的选择。

首先,你定义你的 “下载和处理” 的操作:如果你想运行它们所有同时

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(以及后面的资源)。

相关问题