我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c#中task与thread区别是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c#中task与thread区别是什么

这篇文章主要介绍了c#中task与thread区别是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1.什么是thread

当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞争而消耗资源。thread默认为前台线程,主程序必须等线程跑完才会关闭,而threadpool相反。

总结:threadpool确实比thread性能优,但是两者都没有很好的api区控制,如果线程执行无响应就只能等待结束,从而诞生了task任务。

2.什么是task

 task简单地看就是任务,那和thread有什么区别呢?Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

3.创建一个task任务有两种模式:

使用factory创建会直接执行,使用new创建不会执行,必须等到start启动之后才执行。

 public void test()        {            var testTask = new Task(() =>            {                Console.WriteLine("task start");            });            testTask.Start();            var factoryTeak = Task.Factory.StartNew(() =>            {                Console.WriteLine("factory task start");            });        }

我们来看看task的生命周期

var testTask = new Task(() =>            {                Console.WriteLine("task start");                System.Threading.Thread.Sleep(2000);            });            Console.WriteLine(testTask.Status);            testTask.Start();            Console.WriteLine(testTask.Status);            Console.WriteLine(testTask.Status);                     testTask.Wait();            Console.WriteLine(testTask.Status);            Console.WriteLine(testTask.Status);

输出结果:

Created
task start
Running
Running
RanToCompletion
RanToCompletion

可以看出task确实是异步执行,并且wait很好地控制了task。

下面演示几个控制task的方法

     var testTask = new Task(() =>            {                Console.WriteLine("task start");                System.Threading.Thread.Sleep(2000);            });            testTask.Start();            testTask.Wait();
 var testTask = new Task(() =>            {               Console.WriteLine("task start");               System.Threading.Thread.Sleep(2000);            });            testTask.Start();var factoryTeak = Task.Factory.StartNew(() =>               {                                   Console.WriteLine("factory task start");               });              Task.WaitAll(testTask, factoryTeak);              Console.WriteLine("end");
 var testTask = new Task(() =>            {                Console.WriteLine("task start");                System.Threading.Thread.Sleep(2000);            });            testTask.Start(); var factoryTeak = Task.Factory.StartNew(() =>               {                                    Console.WriteLine("factory task start");                });                Task.WaitAny(testTask, factoryTeak);                Console.WriteLine("end");

通过wait()对单个task进行等待,Task.waitall()对多个task进行等待,waitany()执行任意一个task就往下继续执行。

task的回调执行

  var testTask = new Task(() =>            {                Console.WriteLine("task start");                System.Threading.Thread.Sleep(2000);            });            testTask.Start();            var resultTest = testTask.ContinueWith<string>((Task) => {                Console.WriteLine("testTask end");                return "end";            });            Console.WriteLine(resultTest.Result);

task的取消

首先创建一个取消task的令牌的实例,在不启动task直接取消:

var tokenSource = new CancellationTokenSource();//创建取消task实例            var testTask = new Task(() =>            {                for (int i = 0; i < 6; i++) {                    System.Threading.Thread.Sleep(1000);                }                           },tokenSource.Token);            Console.WriteLine(testTask.Status);            tokenSource.Token.Register(()=> {                Console.WriteLine("task is to cancel");            });            tokenSource.Cancel();            Console.WriteLine(testTask.Status);

 输出结果:

Created
task is to cancel
Canceled

如果task启动了真的取消了task?

  var tokenSource = new CancellationTokenSource();//创建取消task实例            var testTask = new Task(() =>            {                for (int i = 0; i <6; i++) {                    System.Threading.Thread.Sleep(1000);                }                           },tokenSource.Token);            Console.WriteLine(testTask.Status);            testTask.Start();            Console.WriteLine(testTask.Status);            tokenSource.Token.Register(()=> {                Console.WriteLine("task is to cancel");            });            tokenSource.Cancel();            Console.WriteLine(testTask.Status);            for (int i = 0; i < 10; i++)            {                System.Threading.Thread.Sleep(1000);                Console.WriteLine(testTask.Status);            }

输出结果:

Created
WaitingToRun
task is to cancel
Running
Running
Running
Running
Running
Running
RanToCompletion
RanToCompletion
RanToCompletion
RanToCompletion
RanToCompletion

 可以看出其实并没有取消task,此时task还在继续跑。

task的嵌套

  var parentTask = new Task(()=> {                var childTask = new Task(() =>{                    System.Threading.Thread.Sleep(2000);                    Console.WriteLine("childTask to start");                });                childTask.Start();                Console.WriteLine("parentTask to start");            });            parentTask.Start();            parentTask.Wait();            Console.WriteLine("end");

此时为普通关联,父task和子task没影响

  var parentTask = new Task(()=> {                var childTask = new Task(() =>{                    System.Threading.Thread.Sleep(2000);                    Console.WriteLine("childTask to start");                }, TaskCreationOptions.AttachedToParent);                childTask.Start();                Console.WriteLine("parentTask to start");            } );            parentTask.Start();            parentTask.Wait();            Console.WriteLine("end");

此时为父task和子task关联,wait会一直等待父子task执行完。

task死锁的问题

我们可以设置最大等待时间,如果超过了等待时间,就不再等待,下面我们来修改代码,设置最大等待时间为5秒(项目中可以根据实际情况设置),如果超过5秒就输出哪个任务出错了

对Spinlock的使用

举例来说Parallel.for和Parallel.foreach是线程不安全的,有可能达不到你的预期,此时就需要加锁来解决此问题,我们可以加lock和spinlock(自旋锁)来解决

            SpinLock slock = new SpinLock(false);            var testLock= new object();            long sum1 = 0;            long sum2 = 0;            long sum3 = 0;            Parallel.For(0, 100000, i =>            {                sum1 += i;            });             Parallel.For(0, 100000, i =>            {                bool lockTaken = false;                try                {                    slock.Enter(ref lockTaken);                    sum2 += i;                }                finally                {                    if (lockTaken)                        slock.Exit(false);                }            });            Parallel.For(0, 100000, i =>            {                lock(testLock)                {                    sum3 += i;                };            });            Console.WriteLine("Num1的值为:{0}", sum1);            Console.WriteLine("Num2的值为:{0}", sum2);            Console.WriteLine("Num3的值为:{0}", sum3);

输出结果:

Num1的值为:1660913202
Num2的值为:4999950000
Num3的值为:4999950000

Num1的值为:2754493646
Num2的值为:4999950000
Num3的值为:4999950000

Num1的值为:4999950000
Num2的值为:4999950000
Num3的值为:4999950000

最后看看threadpoll和task的结构图:

threadpool:

c#中task与thread区别是什么

 task:

c#中task与thread区别是什么

感谢你能够认真阅读完这篇文章,希望小编分享的“c#中task与thread区别是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c#中task与thread区别是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c#中task与thread区别是什么

这篇文章主要介绍了c#中task与thread区别是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.什么是thread当我们提及多线程的时候会想到thread和thre
2023-06-29

C#中Backgroundworker与Thread的区别是什么

本篇内容介绍了“C#中Backgroundworker与Thread的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.Backg
2023-07-02

c#中Task.Wait()与awaiat Task异常处理的区别是什么

这篇“c#中Task.Wait()与awaiat Task异常处理的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“
2023-07-02

idea中All和Thread的区别是什么

这篇文章主要介绍“idea中All和Thread的区别是什么”,在日常操作中,相信很多人在idea中All和Thread的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”idea中All和Thread
2023-06-29

c#中monitor与mutex的区别是什么

在C#中,Monitor和Mutex都是用来控制并发访问的机制,但它们有一些区别:Mutex是一个系统级别的同步对象,而Monitor是一个应用级别的同步对象。Mutex可以在不同进程之间进行同步,而Monitor只能在同一进程中的不同线程
c#中monitor与mutex的区别是什么
2024-03-15

C++中const与constexpr的区别是什么

这篇文章主要讲解了“C++中const与constexpr的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中const与constexpr的区别是什么”吧!一.const常量
2023-06-21

C#与C++枚举的区别是什么

本篇内容介绍了“C#与C++枚举的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C++与C#中枚举的区别一、C++枚举类型中的每个
2023-06-30

C++与C语言的区别是什么

这篇“C++与C语言的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++与C语言的区别是什么”文章吧。1. 结构
2023-06-29

Java中Runnable和Thread有什么区别

这篇文章给大家介绍Java中Runnable和Thread有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Threa
2023-06-17

Android中Handler、Thread、HandlerThread有什么区别

在Android中,Handler、Thread和HandlerThread是用于处理异步任务的三个重要类。它们之间的区别如下:1. Thread(线程):Thread是Java中用于执行代码的基本单元。在Android中,Thread类用
2023-08-09

C++中strlen(),sizeof()与size()的区别是什么

本篇内容介绍了“C++中strlen(),sizeof()与size()的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!详细介绍1
2023-06-30

Thread Safe和None Thread Safe在php中有什么区别

本篇文章为大家展示了Thread Safe和None Thread Safe在php中有什么区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Windows版的PHP从版本5.2.1开始有Threa
2023-06-15

C++中指针与引用的区别是什么

这篇文章主要介绍了C++中指针与引用的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中指针与引用的区别是什么文章都会有所收获,下面我们一起来看看吧。1、指针的声明上文中提到,指针和其所指向的变量
2023-06-19

C#中异步方法返回的void和Task有什么区别

C#中异步方法返回的void和Task有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#异步方法返回void和Task的区别如果异步(async关键字
2023-06-06

Android中Handler、Thread和HandlerThread有什么区别

Handler是Android中用来处理消息和线程间通信的工具,主要用于将消息发送到消息队列,并在指定的时间处理这些消息。Handler通常与Looper和Message配合使用,可以在主线程中创建Handler,也可以在子线程中创建Han
Android中Handler、Thread和HandlerThread有什么区别
2024-03-01

java与c语言的区别是什么

这篇文章将为大家详细讲解有关java与c语言的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录