async lambda没有等待

时间:2015-09-23 18:18:19

标签: c# asynchronous lambda

我有一个名为Use的扩展方法,它以Action为参数:

IEnumerable<User> users;

service.Use(client => {
    users = client.GetUsers();
});

// users has a value now

当我使用asyncGetUsers()时:

IEnumerable<User> users;

service.Use(async (client) => {
    users = await client.GetUsersAsync();
});

// users is null

...然后在// users is null返回结果之前到达行await client.GetUsersAsync()

如果我Action的正文包含await个关键字,如何确保执行不会在Use()之前await继续执行Action 1}}的身体已经完成了?

请注意,我无法更改Use()的签名。 Action参数无法更改为Func

1 个答案:

答案 0 :(得分:1)

如果您希望等待异步lambda,则需要更改Use的签名:

Task Use(Func<Task> action)
{
  await action();
}

然后等待它:

await service.Use(async (client) => {
  users = await client.GetUsersAsync();
});

如果你不能这样做,你唯一的选择是等待任务完成而不是等待它(这首先违背了使用异步方法的目的):

service.Use((client) => {
  users = client.GetUsersAsync().Result;
});