【发布时间】:2019-10-19 20:13:06
【问题描述】:
代码如下:
static async Task Main(string[] args)
{
var t = new Task(async () => await AsyncTest());
t.Start();
t.Wait();
Console.WriteLine("Main finished");
}
private static async Task AsyncTest()
{
Thread.Sleep(2000);
await Task.Delay(2000);
Console.WriteLine("Method finished");
}
我的期望是 t.Wait() 实际上会等待 AsyncTest 方法完成,输出将是:
Method finished
Main finished
实际上输出只有Main finished。当您在 AsyncTest 中点击 await Task.Delay(2000) 时,Wait() 就完成了。如果将 t.Wait() 替换为 await t / await Task.WhenAll(t) / Task.WaitAll(t),也会发生同样的情况。
解决方法是将方法重写为同步实现或直接在AsyncTest()上调用Wait()。然而,问题是它为什么会以这种奇怪的方式工作?
附:这是代码的简化版本。我试图实现延迟任务执行。实际上Task对象是由程序的一部分创建的,然后在某些特定条件下由另一部分执行。
UPD:将 var t = new Task(async () => await AsyncTest()) 重写为 var t = new Task(()=> AsyncTest().Wait()) 也可以解决问题。虽然我仍然不太明白为什么 Task 不能在委托中使用 async/await 正常工作。
【问题讨论】:
-
不要使用
var task = new Task(...); task.Start();,只使用Task.Run。 -
在我的真实程序中,任务已延迟执行。任务对象在一个地方创建,然后在程序的另一部分执行特定条件后。
-
@WiktorZychla
AsyncTest返回一个任务,但async () => await AsyncTest()lambda 将其丢弃,因为它本身就是一个Action(void)。() => AsyncTest().Wait()会“修复”它(由于Wait()仍然会出错)。 -
var t1 = new Task<Task>(async () => await AsyncTest()); var t2 = t1.Unwrap(); t1.Start(); t2.Wait();
标签: c# .net asynchronous