【问题标题】:Does await Task.FromResult give any benefit?await Task.FromResult 有什么好处吗?
【发布时间】:2019-01-18 07:41:34
【问题描述】:

我使用这种形式的代码编写了基线:

Var result = await Task.FromResult(_someObject.SomeNonAsyncMethod(someParameterObject));

根据我对Task.FromResult的理解,这只是将一个对象打包成一个结果表单,而不是将一个方法打包成一个异步执行的任务。因此,这些操作会增加额外的开销而没有任何好处。

这种理解正确吗?

这种使用 await 对性能有什么帮助吗?

应该以这种方式使用 await Task.FromResult 吗? (考虑到这一行单独使用 - 不实现接口或在测试中等)

提前感谢您提供任何见解!

【问题讨论】:

标签: c# c#-4.0 async-await


【解决方案1】:

像这样将两半放在同一行代码中是没有用的。但是,将其同步结果打包到Task 中以符合接口对函数很有用。

在某些情况下,一个函数甚至可能同时具有同步和异步执行。例如,在快速本地缓存中可能存在同步查找,而在缓存未命中时,可能存在缓慢的网络操作。像这样的函数必须有一个Task 返回类型,这意味着同步退出需要从已知结果构造一个Task。

【讨论】:

    【解决方案2】:

    有时你必须实现一个接口,或者重写一个声明为异步的抽象虚函数,但没有异步函数可以调用。

    例如,我在一个接口中有一个方法可以获取一个人:

    async Task<Person> FetchPersonAsync(int);
    

    如果您想从一些缓慢的输入中获取人员,例如从数据库、互联网或文件中,那么为此使用 async 函数将是有意义的。但是,如果您必须从本地字典中读取它,例如在单元测试中模拟,那么您没有任何 async 函数可以等待。

    如果没有可供您等待的异步函数,但您必须实现异步函数,请使用 FromResult:

    async Task<Person> FetchPerson(int id)
    {
        return await Task.FromResult<Person>(this.myPersonPictionary[id]);
    }
    

    出于性能原因,我只会在您确实需要实现这样的功能并且您没有等待的情况下才这样做。

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2015-01-09
      • 2020-10-29
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      相关资源
      最近更新 更多