C# - Task.FromResult会产生很大的性能损失吗?

4

我对使用C#进行async编程还有些陌生,遇到一些情况需要我实现的方法(可能是从一个接口或继承服务中得到的,或者只是默认建议)会被标记为async并且期望返回Task<T>

但我并不总是需要运行async代码,也不总是需要await操作符。

因此,我的临时解决方法是针对这种类型的方法,返回await Task.FromResult({normal code});,就像这样...

public async Task<JsonResult> Id() {
    // if the user is not authenticated, simply return false
    if (!User.Identity.IsAuthenticated || String.IsNullOrEmpty(User.Identity.Name))
        return await Task.FromResult(Json(false));
    return await Task.FromResult((Json(User?.FindFirst("users/id")?.Value ?? null)));
}

这确实解决了编译时错误,但我想知道这样做是否存在潜在问题。如果有的话,有哪些好的方法可以绕过被标记为async且无法更改的事物?


2
如果没有需要等待的内容,请不要将方法标记为“async”。 - Servy
在您的情况下,使用Task.FromResult没有任何问题,它已经被设计用来解决像您遇到的这样的问题(除了许多其他原因)。但在您上面的情况下,不需要等待您的任务,只需返回它们并删除async即可。 - user5766999
即使返回类型标记为 Task<T> - Ciel
即使返回类型是 int,也不需要使用 Int.Parse(42.ToString())... 不确定为什么您认为 Task<T> 有什么特殊之处。 - Alexei Levenkov
2
@Ciel,是的,每当您将async添加到返回Task的方法中时,您都要求.NET将您的方法转换为状态机,该状态机在异步方法之后执行一段逻辑。在这里,您只想返回任务。 - user5766999
1个回答

3
与其创建一个Task,然后添加一个继续该任务的方法,该方法仅将其包装在相同的Task中,不如返回您创建的第一个任务
由于没有任何需要await的内容,因此无需将该方法标记为async
考虑FromResult的性能成本是毫无意义的讨论。您需要基于结果创建一个任务,因此需要进行工作。 考虑它的昂贵程度是无关紧要的,因为您没有其他选择。如果您认为自己可以编写比Microsoft版本更好的FromResult方法,则可以尝试创建自己的方法。
话虽如此,但这并不是特别昂贵的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接