以下是代码:
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() 就已经完成了。如果您用 await t
/ await Task.WhenAll(t)
/ Task.WaitAll(t)
替换 t.Wait()
,情况也是一样的。
解决方法是将方法重写为同步实现或直接在 AsyncTest() 上调用 Wait()。但问题是为什么它会以这种奇怪的方式工作?
P.S. 这是代码的简化版本。我尝试实现延迟任务执行。实际上,Task 对象由程序的一部分创建,然后在满足某些特定条件之后由另一部分执行。
更新:将 t = new Task(async () => await AsyncTest())
改写为 t = new Task(()=> AsyncTest().Wait())
也可以解决问题。虽然我仍然不太理解为什么 Task 在委托内部使用 async/await 时不能正常工作。
var task = new Task(...); task.Start();
,而是直接使用Task.Run
。 - mtkachenkoAsyncTest
返回一个任务,但是async () => await AsyncTest()
lambda 会将其丢弃,因为它本身是一个Action
(void
)。() => AsyncTest().Wait()
可以“修复”它(仍然不正确,因为有Wait()
)。 - GSergvar t1 = new Task<Task>(async () => await AsyncTest()); var t2 = t1.Unwrap(); t1.Start(); t2.Wait();
- user4003407