无法将lambda表达式转换为类型"...",因为它不是委托类型

mas*_*m64 7 .net c# lambda asynchronous async-await

美好的一天!我试图使用lambda表达式编写一个匿名方法,该表达式将从异步任务返回一个对象.我想在构造函数中执行此操作,因此这是我无法使其父方法异步的原因.

ReadJsonAsync方法返回一个Session对象.我会告诉你相关的代码:

Session session;
fileService = new FileService();
session = async () =>  { return await fileService.ReadJsonAsync() };
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Yuv*_*kov 8

如果你想要一个匿名方法,你必须声明一个返回a,Task<Session>因为它用async修饰符标记,因此必须返回一个void(仅用于异步事件处理程序),Task或者Task<T>:

Func<Task<Session>> anonFunction = async () => await fileService.ReadJsonAsync();
Run Code Online (Sandbox Code Playgroud)

如果你所做的只是运行ReadJsonAsync,你也可以像以下那样为自己保存状态机:

Func<Task<Session>> anonFunction = fileService.ReadJsonAsync;
Run Code Online (Sandbox Code Playgroud)

然后你可以await在更高阶函数上:

Func<Task<Session>> anonFunction = fileService.ReadJsonAsync;
await anonFunction();
Run Code Online (Sandbox Code Playgroud)


Gaz*_*yer 7

添加到 Yuval 的有用答案中,如果您只想等待一个内联函数,那么神奇的语法是:

await ((Func<Task>)(async () =>
{
    //async function code
}
))();
Run Code Online (Sandbox Code Playgroud)

请注意末尾的额外括号以在声明后立即调用 lambda。显然,如果您的函数返回一个类型,那么它将是Func<Task<Whatever>>

Task.WhenAny()例如,如果您正在使用等待内联函数和超时任务,则很有用。