【问题标题】:C# - does Task.FromResult incur a heavy penalty?C# - Task.FromResult 是否会受到重罚?
【发布时间】:2016-02-08 19:24:30
【问题描述】:

我对使用C# 编码的async 有点陌生,并且遇到了一些我必须实现的方法(来自接口或继承服务的一部分,或者只是建议的默认约定)的地方标记为async 并期待Task<T> 返回。

但我并不总是要运行异步代码;我并不总是有需要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 的问题?

【问题讨论】:

  • 如果您没有任何等待,请不要将方法标记为async
  • 在您的上下文中使用Task.FromResult 没有任何问题,它的设计(以及许多其他原因)旨在解决您遇到的问题。但是在您上面的情况下,不需要await您的任务,只需返回它们并删除async
  • 即使返回类型标记为Task&lt;T&gt;?
  • 即使返回类型是int 也不需要Int.Parse(42.ToString())...不知道为什么你认为Task&lt;T&gt; 在任何方面都很特别。
  • @Ciel,是的,每当您将async 添加到返回Task 的方法时,您就是在要求.NET 将您的方法转换为执行一段逻辑@987654340 的状态机@你的异步方法。这里你要做的就是返回任务

标签: c# asynchronous


【解决方案1】:

与其创建Task,不如向该任务添加一个延续,它确实注意到但将其包装在相同的Task 中,只需返回您创建的第一个任务。 p>

既然你对await一无所知,那么没有理由将该方法标记为async

考虑FromResult 的性能成本是毫无意义的讨论。您需要根据您拥有的结果创建一个任务,以便完成工作。考虑到它有多贵是无关紧要的,因为您没有其他选择。如果您认为自己可以编写一个性能优于 Microsoft 版本的方法,您可以尝试创建自己的 FromResult 方法。

也就是说,不,它并不是特别昂贵的手术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2019-02-20
    • 1970-01-01
    • 2018-06-06
    • 2013-02-08
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多