考虑这一点,
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();
在你的拉姆达例如,当你调用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();
您需要使用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;