[英]Why are parallel tasks not running?
我有這段代碼,它是為了證明問題而剝離的更大功能的骨架:
var tasks = Enumerable.Range(0, 10)
.Select(laneNo => Task.Run(() => Console.WriteLine($"Starting generator for lane {laneNo}")));
for(int r=0; ;++r)
{
Task.Delay(TimeSpan.FromSeconds(3)).Wait();
Console.WriteLine($"Iteration {r} at {DateTime.Now}");
}
我從來沒有看到“啟動生成器”打印到控制台,但我確實看到迭代每 3 秒觸發一次 - 某些原因導致這些任務無法進行(在實際代碼中它們運行了很長一段時間,但刪除它不會影響問題) .
為什么第一批任務沒有運行? 我的理論是它與Task.Delay
有關嗎?
您的 linq-statment 永遠不會實現。 Linq 運算符,如 Select、Where、OrderBy 等,它們作為構建塊鏈接在一起,但在您通過 foreach 運行它或使用不返回可枚舉的運算符(如 ToArray、ToList、First、Last 等)之前,它們不會執行。
如果您在最后調用 ToList,您應該會看到所有正在執行的任務,但如果您只調用 First,您應該只會看到一個,因為原始 Range 的迭代將在第一個元素之后終止。
LINQ Select
已延遲執行; 它只是定義了一個迭代器,因此不會生成您的Task
。
您可以使用Task.WhenAll(IEnumerable<Task>)
,它將迭代並等待每個Task
,生成新的Task
一旦所有提供的任務也完成后完成:
var tasks = Enumerable.Range(0, 10)
.Select(laneNo => Task.Run(() => Console.WriteLine($"Starting generator for lane {laneNo}")));
await Task.WhenAll(tasks);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.