不能等待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;
- 在方法名称中使用“asynchronous”后缀取决于是否使用“asynchronous”修饰符?
- 如何在循环中使用await
- C#中“return await”的目的是什么?
- 为什么我会打扰使用Task.ConfigureAwait(continueOnCapturedContext:false);
- 如何限制并发asynchronousI / O操作的数量?
- 为什么要创buildasynchronousWebAPI操作而不是同步?
- 你如何实现一个asynchronous操作委托方法?
- 在asynchronous方法结束时,我应该返回还是等待?
- 为什么Thread.CurrentPrincipal需要“等待Task.Yield()”?