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

时间:2014-11-15 14:31:31

标签: c# .net asynchronous async-await lambda

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

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

Session session;
fileService = new FileService();
session = async () =>  { return await fileService.ReadJsonAsync() };

提前致谢!

2 个答案:

答案 0 :(得分:8)

如果您需要匿名方法,则必须声明一个返回Task<Session>的方法,因为它标有async修饰符,因此必须返回{ {1}}(仅适用于异步事件处理程序),voidTask

Task<T>

如果你所做的只是运行Func<Task<Session>> anonFunction = async () => await fileService.ReadJsonAsync(); ,你也可以自己保存状态机代:

ReadJsonAsync

然后你可以在更高阶函数上Func<Task<Session>> anonFunction = fileService.ReadJsonAsync;

await

答案 1 :(得分:1)

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

await ((Func<Task>)(async () =>
{
    //async function code
}
))();

请注意最后的多余括号,以在声明后立即调用lambda。显然,如果您的函数返回类型,则该类型为Func<Task<Whatever>>

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