【发布时间】:2016-08-09 02:45:53
【问题描述】:
我有一个返回Task<String> 的函数,要构造这个Task,我必须使用匿名async 函数,因为我必须在await 中多次调用Task。我发现我可以返回 "",但如果我尝试返回 null 则会出现错误(Visual Studio 消息)
转换为 void 返回委托的匿名函数无法返回值
转换为“任务”返回委托的异步 lambda 表达式无法返回值。您是否打算返回“任务”?
显示相同问题的函数
public virtual Task<String> FooBar()
{
return Task<String>.Run(async () =>
{
await Task.Delay(1500);
return ""; // OK
//return null; // Error
});
}
这里发生了什么?
如果我想返回一个空值,return await Task.FromResult<String>(null); 会更合适吗?
【问题讨论】:
-
你为什么首先使用
Task.Run?你没有 CPU 绑定的工作,你有异步工作;只需完全删除该调用,因为它在这里什么也没做。 -
值得注意的是
Task<String>.Run与Task.Run完全相同,因为它是基类上的静态方法。编译器仍然需要从提供给Run的委托中推断返回类型(仅使用null无法继续)。 -
@CharlesMager 说得通,并解决了另一个“问题”。 Visual Studio 使
<String>部分略微变灰,指出它不是必需的。我知道它以某种方式推断类型,但现在我明白它是如何做到的了。 -
@Servy 方法
FooBar旨在创建一些任务来执行可能会受到 CPU 限制的任务。在某些情况下,“真正的工作”已经完成,但在其他情况下,它是异步的。当我写下我从错误消息中假设的问题时,它必须专门使用async函数,尽管现在我发现情况并非如此。 -
标签: c#