Bob*_*Bob 4 .net c# task-parallel-library async-await tpl-dataflow
我工作的公司运行着几百个非常动态的网站.它决定建立一个搜索引擎,我的任务是编写刮刀.有些网站在旧硬件上运行,无法承受太多惩罚,而其他网站则可以处理大量的并发用户.
我需要能够说对站点A使用5个并行请求,对站点B使用2个,对站点C使用1个并行请求.
我知道我可以使用线程,互斥体,信号量等来实现这一目标,但它会非常复杂.是否有任何更高级别的框架,如TPL,await/async,TPL Dataflow足够强大,能够以更简单的方式完成此应用程序?
Ste*_*ary 10
我推荐你使用HttpClientwith Task.WhenAllwith with SemaphoreSlimsimple throttle:
private SemaphoreSlim _mutex = new SemaphoreSlim(5);
private HttpClient _client = new HttpClient();
private async Task<string> DownloadStringAsync(string url)
{
await _mutex.TakeAsync();
try
{
return await _client.GetStringAsync(url);
}
finally
{
_mutex.Release();
}
}
IEnumerable<string> urls = ...;
var data = await Task.WhenAll(urls.Select(url => DownloadStringAsync(url));
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用TPL Dataflow并设置MaxDegreeOfParallelism限制.
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |