簡體   English   中英

並行運行多個任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM