首页 > 其他分享 >多线程 Task

多线程 Task

时间:2023-03-17 09:01:35浏览次数:37  
标签:Task TPL 任务 线程 TaskMethod 多线程 运行

Net Framework4.0引入了一个新的关于异步操作的API,它叫做.任务并行库( Task Parallel Library,简称TPL), .Net Framework 4.5版对该API进行了轻微的改进,使用更简单。TPL可被认为是线程池之上的又一个抽象层,其对程序员隐藏了与线程池交互的底层代码,并提供了更方便的细粒度的APL, TPL的核心概念是任务。一个任务代表了一个异步操作,该操作可以通过多种方式运行,可以使用或不使用独立线程运行。

一个任务可以通过多种方式和其他任务组合起来。例如,可以同时启动多个任务,等待所有任务完成,然后运行一个任务对之前所有任务的结果进行一些计算。TPL与之前的模式相比,其中一个关键优势是其具有用于组合任务的便利的API,

处理任务中的异常结果有多种方式。由于一个任务可能会由多个其他任务组成,这些任,务也可能依次拥有各自的子任务,所以有一个AggregateException的概念。这种异常可以捕获底层任务内部的所有异常,并允许单独处理这些异常。

  而且,最后但并不是最不重要的, C# 5.0已经内置了对TPL的支持,允许我们使用新的 await和async关键字以平滑的、舒服的方式操作任务。

创建任务

namespace ConsoleAppTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
           var t1=new Task(()=> TaskMethod("Task 1"));//仅当调用Start()方法时才会执行
            var t2 = new Task(() => TaskMethod("Task 2"));
            t2.Start();
            t1.Start();
            Task.Run(() => TaskMethod("Task 3"));//立即执行,是StartNew 的快捷方式
            Task.Factory.StartNew(() => TaskMethod("Task 4"));//立即执行
            //标记任务长时间运行,结果任务将不会使用线程池,而在单独的线程中运行,
            //然而,根据运行该任务的当前的任务调度程序( task scheduler)运行方式有可能不同。
            Task.Factory.StartNew(()=>TaskMethod("Task 5"),TaskCreationOptions.LongRunning);
            Thread.Sleep(TimeSpan.FromSeconds(1));

            Console.ReadKey();
        }

        static void TaskMethod(string name)
        {
            Console.WriteLine("任务: {0} 线程ID: {1}. 是否在线程池中: {2}",
                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
        }
    }
}

  

 

注意:每次运行,任务的执行顺序可能不一样,Task 5 标记任务长时间运行,结果任务将不会使用线程池,而在单独的线程中运行,

 

标签:Task,TPL,任务,线程,TaskMethod,多线程,运行
From: https://www.cnblogs.com/friend/p/17225356.html

相关文章

  • 多线程(下)
    并发编程(下)课程目标:掌握多进程开发的相关知识点并初步认识协程。今日概要:多进程开发进程之间数据共享进程锁进程池协程1.多进程开发进程是计算机中资源分配的......
  • 【Python】使用 multiprocessing.dummy 执行多线程任务
    1.#-*-coding:utf-8-*-2.#frommultiprocessingimportPool多进程3.frommultiprocessing.dummyimportPoolasThreadPool#多线程4.importtime5.im......
  • redis开启多线程
    在Redis6.0中,非常受关注的第一个新特性就是多线程。在Redis6.0中,多线程默认是禁用的,只使用主线程。如果需要使用多线程功能,需要在redis.conf文件中进行配置(重启服务)。......
  • [EF Core] 多线程执行SQL Command
     publicclassXXXRepository{//数据库上下文privateXXXDBContextcontext;//作用域服务工厂privatereadonlyIServiceScopeFactory_servic......
  • python爬虫增加多线程采集数据
    Python爬虫对于现如今大数据满天飞的时代来说真是如虎添翼,也越来越多的领域喜欢用Python来实现数据采集。像Scrapy、Request、BeautifuSoap、urlib等框架都可以实现自动爬......
  • 多线程初级
    多线程1.4实现多线程方式一:继承Thread类【应用】方法介绍方法名说明voidrun()在线程开启后,此方法将被调用执行voidstart()使此线程开始执行,Java虚拟......
  • linux系统如何查看是否是线程死锁,多线程中如何使用gdb精确定位死锁问题
    在多线程开发过程中很多人应该都会遇到死锁问题,死锁问题也是面试过程中经常被问到的问题,这里介绍在c++中如何使用gdb+python脚本调试死锁问题,以及如何在程序运行过程中......
  • Python多线程的坑——切换工作目录导致错误
    Python多线程的坑——切换工作目录导致错误复现:importosimporttimefromconcurrent.futuresimportThreadPoolExecutordefthread_func(a):origin=os.get......
  • Linux系统中多线程实现方法的全面解析
    ​线程引入:     在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么......
  • Day 16 16.4 案例分析之对比单线程与多线程
    线程案例:爬取斗图吧表情包图片方案一:单线程版本耗时慢importrequestsfromfake_useragentimportUserAgentimportrandomfromlxmlimportetreeimportosimpo......