簡體   English   中英

為什么並行任務不運行?

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

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