[英]Running Multiple Tasks in Parallel
我有一個代理列表,每個代理都轉到各個站點,並從站點中提取所需的數據。 目前,它一次執行一次。 但是我想一次運行10到20個任務,因此可以一口氣從20個站點下載,而不僅僅是一個。
這是我目前的操作方式:
private async Task<string> DownloadDataFromSite(string url)
{
// (await) Do Work.
return HTMLSourceCode;
}
然后我遍歷代理
foreach(Proxy p in proxies)
{
string source = await DownloadDataFromSite(site);
}
Parallel.ForEach
是否適合此類任務? 我已經嘗試過了,但是目前遇到的問題是無法await
。
一種方法是避免在foreach中等待。 問題是您的await
有效地阻止了您的執行。 更好的方法可能是這樣的:
await Task.WhenAll(proxies.Select(p => DownloadDataFromSite(site)));
這意味着您將立即等待所有任務,這意味着異步I / O將並行發生。 請注意,如果您也正在執行CPU工作,那將不會真正實現並行化。
關鍵是,異步I / O(例如下載網頁)不需要並行運行更多線程。 另一方面, Parallel.ForEach
實際上是用於CPU綁定的工作,而不是I / O綁定的工作,它確實在多個線程上執行代碼。
PArallel.ForEach
不能正常運行,因為它需要同步的lambda,而給它一個異步的lambda基本上會導致它在啟動后立即返回。 但是,有一種解決方法,請檢查以下問題: 是否可以在某些.NET Parallel.ForEach()代碼內進行異步/等待?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.