不能等待asynchronouslambda

考虑到这一点,

Task task = new Task (async () =>{ await TaskEx.Delay(1000); }); task.Start(); task.Wait(); 

调用task.Wait()不会等待任务完成,并立即执行下一行,但如果将asynchronouslambdaexpression式包装到方法调用中,则代码将按预期工作。

 private static async Task AwaitableMethod() { await TaskEx.Delay(1000); } 

然后(根据svick评论更新)

 await AwaitableMethod(); 

在您的lambda示例中,当您调用task.Wait() ,您正在等待您构build的新任务,而不是它返回的延迟任务。 为了获得所需的延迟,您还需要等待所产生的任务:

 Task<Task> task = new Task<Task>(async () => { await Task.Delay(1000); }); task.Start(); task.Wait(); task.Result.Wait(); 

你可以避免构build一个新的任务,只需要一个任务来处理而不是两个:

 Func<Task> task = async () => { await TaskEx.Delay(1000); }; task().Wait(); 

您需要使用TaskEx.RunEx

它本身支持在TaskPool通过等待内部任务来运行async方法。 否则,你会遇到你正面临的问题,只有外部任务正在等待,这显然是立即完成,留下一个任务仍然需要等待,或在你的情况下(甚至更糟)一个无效的lambda不能是期待已久的。

或者,您可以等待任务两次,为您提供正确的外部任务(目前您不是)。

当前代码(固定):

 Task task = new Task<Task>(async () =>{ await TaskEx.Delay(1000); }); task.Start(); var innerTask = await task; await innerTask; 

使用TaskEx.RunEx:

 Task task = TaskEx.RunEx(async () =>{ // Framework awaits your lambda internally. await TaskEx.Delay(1000); }); await task;