我有一个名为Use
的扩展方法,它以Action
为参数:
IEnumerable<User> users;
service.Use(client => {
users = client.GetUsers();
});
// users has a value now
当我使用async
版GetUsers()
时:
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
。
答案 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;
});