在任何返回Task的方法中,如果可以在不进行异步的情况下计算结果,则最好避免使用Task.Run。例如,一个简短的计算函数,或者测试中返回了一个预先计算过的结果,则无需使用Task.Run。

例如,定义了一个返回Task的接口方法,但是在实现中,并没有特别耗时的代码。

public interface IComputer    {    Task Do();Task<string> DoString();
}
一般我们会这样实现。即使实现中代码很简短。
public class Computer : IComputer
{    public Task Do()    {  return Task.Run(() => {//逻辑代码});}public Task<string> DoString()        {        return Task.Run( () => {//逻辑代码 return "aaa";});}
}
实际上,Task类上面有两个帮助程序,,这些帮助程序让代码更具可读性,并且所需的运行时开销更少。

对于上述接口实现中的 Do方法,我更愿意使用Task.CompletedTask。

public Task Do()    {            //逻辑代码return Task.CompletedTask;}

我们看一下CompletedTask的定义

/// <summary>Gets a task that has already completed successfully.</summary>
/// <returns>The successfully completed task.</returns>
public static Task CompletedTask { get; }

如果返回Task <T>怎么办?在这种情况下,如果您已经有了答案,请使用Task.FromResult包装答案。

public Task<string> DoString()
{//逻辑代码return Task.FromResult("aaa");
}

看一下FromResult的定义

/// <summary>Creates a <see cref="T:System.Threading.Tasks.Task`1" /> that's completed successfully with the specified result.</summary>
/// <param name="result">The result to store into the completed task.</param>
/// <typeparam name="TResult">The type of the result returned by the task.</typeparam>
/// <returns>The successfully completed task.</returns>
public static Task<TResult> FromResult<[Nullable(2)] TResult>(TResult result);

通过上述的改变,即实现了接口的实现,也减少了Task.Run调用的系统开销。

·END·

Task.CompletedTask和Task.Result小记相关推荐

  1. 【转】1.C Task.CompletedTask和Task.Result小记

    在任何返回Task的方法中,如果可以在不进行异步的情况下计算结果,则最好避免使用Task.Run.例如,一个简短的计算函数,或者测试中返回了一个预先计算过的结果,则无需使用Task.Run. 例如,定 ...

  2. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  3. Task.Run vs Task.Factory.StartNew

    Task.Run 和 Task.Factory.StartNew 都可以把一段要执行的代码放到ThreadPool thread中去执行.Task.Factory.StartNew是.Net 4.0中 ...

  4. Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析

    Spring的任务调度@Scheduled注解--task:scheduler和task:executor的解析 applicationContext 的配置如下: <?xml version= ...

  5. 关于Spring 任务调度之task:scheduler与task:executor配置的详解

    关于Spring 任务调度之task:scheduler与task:executor配置的详解 其实就是Spring定时器中配置文件中一些配置信息,由于笔者自己是头一次使用,有些配置详细不太明白,随即 ...

  6. linux 上下文切换时对用户task和内核task区别对待——针对fpu

    目录 关于pthread和kthread的说明 和kthread/pthread区别对待相关的数据结构 调用图 fpu load/store 在调度中的处理 fpu load/store 在KVM中的 ...

  7. C# Task.Run 和 Task.Factory.StartNew 区别

    有小伙伴问我,为什么不推荐他使用 Task.Factory.StartNew ,因为 Task.Run 是比较新的方法. 本文告诉大家 Task.Run 和 Task.Factory.StartNew ...

  8. 15.3 Task Task.Yield和Task.Delay说明

    https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...

  9. 深度学习网络backbone?head、neck、bottleneck、GAP、Embedding、pretext task、downstream task、temperature parameter

    一些术语: backbone这个单词原意指的是人的脊梁骨,后来引申为支柱,核心的意思.在神经网络中,尤其是CV领域,一般先对图像进行特征提取(常见的有vggnet,resnet,谷歌的inceptio ...

最新文章

  1. 一步步学习SpringBoot(一) 快速搭建一个web
  2. Docker网络模型(八)
  3. 【想象不到的俄罗斯】……太震撼了……
  4. 3D数学 向量和矩阵
  5. IsWindow函数的作用
  6. WTMPlus 低代码平台来了
  7. AI算法连载22:统计之边际概率推断
  8. 【youcans 的 OpenCV 例程200篇】114. 形态学操作之膨胀
  9. mysql 1054 42s22_MySQL 触发器的坑:ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'
  10. Android基础之图片的压缩算法
  11. css 一些特殊样式解决
  12. 【转】移动,电信,中行软开,微软,百度等企业工作纯技术性分析
  13. 算法题目打卡:Ques20201017
  14. 基于ENVI下的土地利用信息提取(一)
  15. sql语句中case when及select case when的用法
  16. python自动排版公众号_请问微信公众号推文如何实现自动排版?
  17. ffmpeg学习日记701-报错-co located POCs unavailable
  18. Java中 方法引用、Stream流、及方法实例 D190401
  19. 张曦予巴黎时装周儿童单元T台走秀演绎童真风采
  20. ubuntu18.04 搭建ffmpeg踩坑

热门文章

  1. mysql之mysqldump命令
  2. (转)学习密度与专注力
  3. Mac OS使用技巧之一:查看Finder中的.bash_profile等系统隐藏文件
  4. 自定义v-drag指令(横向拖拽滚动)
  5. html仿微信滑动删除,使用Vue实现移动端左滑删除效果附源码
  6. yii---where or该如何使用
  7. MAVEN简介之——settings.xml
  8. java web移植 遇到Project facet Java version 1.7 is not supported
  9. 使用 Daynamic 动态添加属性
  10. 换种方式去分页(转)