不能等待异步拉姆达(can not await async lambda)

2019-06-18 14:44发布

考虑这一点,

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

呼叫task.Wait()不会等待任务完成,并在下一行立即执行,但如果我换了异步lambda表达式到方法调用的代码按预期工作。

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

然后(从svick更新根据评语)

await AwaitableMethod(); 

Answer 1:

在你的拉姆达例如,当你调用task.Wait()你正在等待你建造的新任务,而不是延迟任务,它返回。 为了让您所需的延迟,你还需要等待所产生的任务:

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

你可以避开构建一个新的任务,只是有一个任务来处理,而不是两个:

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


Answer 2:

您需要使用TaskEx.RunEx

它原生支持运行async的方式TaskPool通过内部等待内部任务。 否则,你会遇到你所遇到的问题,其中只有任务外等待,这显然立即完成,要么离开它仍然需要等待,或在您的案件(甚至更糟)任务的空隙拉姆达不能是期待已久的。

或者,您可以等待任务的两倍,为您提供正确构造你的任务外(目前你是不是哪个)。

当前代码(固定):

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;


文章来源: can not await async lambda