c# - 无法等待异步 lambda

标签 c# task-parallel-library async-await async-ctp

考虑一下,

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(); 

最佳答案

在您的 lambda 示例中,当您调用 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();

关于c# - 无法等待异步 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046096/

相关文章:

c# - 比较器有变量类型吗?

c# - 对 Access 数据库的异步调用

c# - try catch 异步等待 https 异常

c# - 初始化 Xamarin.Forms 应用程序时找不到调用异步方法的方法

C# Office Development : Microsoft. Office.Tools.Word.Controls.Button 给出错误

c# - 将 DataGrid 的 FontWeight 属性绑定(bind)到值转换器

c# - 独立于 DataTable 存储 DataRow - RowNotInTableException

c# - Parallel.ForEach - 它在单核机器上运行在哪里?

c# - 如何不继续取消的任务?

c# - 使用 Parallel for each 获取堆栈溢出异常,这是由于线程安全吗?