首页 > 其他分享 >Task.CompleteTask和Task.FromResult

Task.CompleteTask和Task.FromResult

时间:2023-05-26 13:55:58浏览次数:32  
标签:Run Task return 线程 CompleteTask FromResult public


问题描述

实现接口中的异步方法时,因为返回值类型是Task或Task<T>,所以即使方法的具体实现逻辑极简执行极快(比如直接返回一个常量字符串),我们可能也需要被迫新建一个Task去执行,如下:

public interface IComputer
{
    Task Do();
    Task<string> DoString();
}
public class MyComputer : IComputer
{
    public Task Do()
    {
        //return Task.Run(() => { Console.WriteLine("逻辑很简单执行很快的代码块,新建一个任务或线程得不偿失,反而损伤性能。"); });
        return Task.Run<string>(() => "逻辑很简单执行很快的代码块,新建一个任务或线程得不偿失,反而损伤性能。");
    }

    public async Task<string> DoString()
    {
        //return Task.Run<string>(() => "逻辑很简单执行很快的代码块,新建一个任务或线程得不偿失,反而损伤性能。");
        return await Task.Run<string>(() => "逻辑很简单执行很快的代码块,新建一个任务或线程得不偿失,反而损伤性能。");
    }
}

上述实现的缺点

开一个Task去执行简单的逻辑会新增开销(构造Task实例,Task排队,线程和上下文切换,回调索取结果,Task状态运转维护等),还不如在当前线程和上下文直接运行划算。


优化手段

可以使用Task.CompletedTask和Task.FromResult优化,二者表示一个已经完成的Task实例,不会产生上下文切换,任务队列排队,回调索取结果等,甚至Task实例都是从缓存中直接返回而不需新建。在满足接口返回形式的前提下,又保证了高性能。

public class MyComputer : IComputer
{
    public Task Do()
    {
        // return Task.FromResult("Hello New Boy");
        return Task.CompletedTask;
    }

    public Task<string> DoString()
    {
        return Task.FromResult("Hello New Boy");
    }
}

标签:Run,Task,return,线程,CompleteTask,FromResult,public
From: https://www.cnblogs.com/LiuwayLi/p/17434488.html

相关文章

  • 异步编程(Thread、ThreadPool、Task、异步关键字async/await)
    一、什么是异步Thread,是微软.Net1.0推出;ThreadPool 是微软.Net2.0推出;Task是微软.Net4.0推出;async/await是微软.Net5.0推出;       同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方......
  • task.6
    #include<stdio.h>#include<string.h>#include<stdlib.h>#defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试typedefstructstudent{intid;//学号charname[20];//姓名charsubject[20];//考......
  • 多线程合集(三)---异步的那些事之自定义AsyncTaskMethodBuilder
    引言之前在上一篇文章中多线程合集(二)---异步的那些事,async和await原理抛析,我们从源码去分析了async和await如何运行,以及将编译后的IL代码写成了c#代码,以及实现自定义的Awaiter,自定义异步状态机同时将本系列的第一篇文章的自定义TaskScheduler和自定义的Awaiter......
  • Airflow 设置Task优先级
    Airflow要设置Task的优先级,涉及到这2个配置1.weight_rule2.priority_weightweight_rule默认是downstream。还有其他2个配置upstream和absolutepriority_weight默认是1比如,下面的DAG1.weight_rule=downstreamtask优先级start5x12x22y11y212.weight_rule=upstreamtask优先级start1x12......
  • closeSocket:fail task not found, uniapp 微信小程序连接不上mqtt!!!
    原来使用的mqttjs版本为4.3.7,连接一直报错,closeSocket:failtasknotfound。降低mqtt.js版本使用4.1.0。引入mqtt的方式使用importmqttfrom'mqtt/dist/mqtt.js'!!!使用constmqtt=require('mqtt'),require方式也提示无法连接!!!......
  • C#中的Task.CompletedTask和Task.Result学习
    在学习C#中的Task方法时,可以知道Task启动一个异步线程方法可以用Task.Run()进行,具体可以参看博客 https://www.cnblogs.com/yaosj/p/10342883.html和 https://www.cnblogs.com/wynblogscc/p/15138423.html但是,在有些返回类型是Task的方法中,可以在不进行异步的情况下计算结果.......
  • Spring Could not find unique TaskExecutor bean 错误
    这个错误其实是debug级别的错误,是不影响运行的。错误栈为:15:27:57.726DEBUG12844---[nio-8080-exec-1].s.a.AnnotationAsyncExecutionInterceptor:CouldnotfinduniqueTaskExecutorbeanorg.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqu......
  • ThreadPoolTaskExecutor与ThreadPoolExecutor的区别及优缺点
    ThreadPoolTaskExecutor和ThreadPoolExecutor都是线程池的实现,但它们有以下几点区别:1.ThreadPoolTaskExecutor是Spring框架中编写的,它对ThreadPoolExecutor进行了封装,提供了更加丰富的功能,更易于在Spring中使用。而ThreadPoolExecutor是JDK中的实现。2.ThreadPoolTaskExe......
  • hadoop中distcp的mapreduce任务中的task0详解及优化
    task0详解distcp是Hadoop中一个用于数据复制的工具,可用于大规模数据复制场景。在distcp执行过程中,会运行多个MapReduce任务,其中第一个任务通常被称为"task0"或"maintask"。task0主要负责以下操作:**1.解析命令行参数并生成distcp配置。**2.预处理数据源列表,对......
  • Spring 3 & jBPM 5 & LocalTaskService
    帖子地址:[url]https://community.jboss.org/thread/195386[/url]HiGuys,IamalsostrugglinginconfigSpring+LocalHumanTask.Iamusing[color=red][b]Spring3.0,JBPM5.4.0.Final,Drools5.5.0.Final[/b][/color]IcanconfigtouseJTA......