【发布时间】:2018-07-06 00:35:56
【问题描述】:
想象一个初始化任务和两个工人:
var Init = Task.Run(async () =>
{
await Task.Delay(1000);
});
var TaskB = Task.Run(async () =>
{
await Init;
Console.WriteLine("B finished waiting");
await Task.Delay(10000000);
});
var TaskC = Task.Run(async () =>
{
await Init;
Console.WriteLine("C finished waiting");
await Task.Delay(10000000);
});
1 秒后,TaskB 和 TaskC 将打印到控制台并按预期继续。
但是,当先完成的任务在等待 Init 后不使用异步方法时,另一个任务 await Init 调用不会完成:
var Init = Task.Run(async () =>
{
await Task.Delay(1000);
});
var TaskB = Task.Run(async () =>
{
await Init;
Console.WriteLine("B finished waiting");
await Task.Delay(5000);
});
var TaskC = Task.Run(async () =>
{
await Init;
Console.WriteLine("C finished waiting");
while (true) { }
});
后一个示例仅将“C 完成等待”打印到控制台。为什么会这样?
【问题讨论】:
-
不可重现:ideone.com/hWZxtZ
-
我将我的演示推送到了 github:github.com/Trolldemorted/DotnetCoreTest/blob/master/… 它完全可以在我的 W10 桌面上重现。编辑:不是完全可重现的,当B首先完成时它工作正常(显然)
-
如果您使用 2 个 whiletrue-loops,它也会在 ideone.com 上重现:ideone.com/Gh26EG
标签: c# multithreading async-await task