C# Task用法详解

概述

  Task是微软在.Net 4.0时代推出来的,Task看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool,所以一经问世,基本ThreadPool就被取代了.

Task用法举例

static void Main(string[] args){string str = "当前时间是";for (int i = 0; i < 10; i++){Task.Run(() => ThreadFuc(str));}Console.ReadKey();}public static void ThreadFuc(string str){Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);}

运行结果:

01f086b5841d6855ef4978f477c35a56.png

这里开了十个线程,task默认就是在线程池中创建线程,他会自行调度和回收不用的线程,减少每次重新创建线程的开销,而且创建的是背景线程。

task有很多封装好的API,比如:

①WaitAll:等待提供的所有 System.Threading.Tasks.Task 对象完成执行过程。

Task.WaitAll(t1,t2);//等待所有任务结束

② WaitAny:等待提供的任一 System.Threading.Tasks.Task 对象完成执行过程。

Task.WaitAny(t1,t2);

③ContinueWith:创建一个在目标 System.Threading.Tasks.Task 完成时异步执行的延续任务。

实例代码:

static void Main(string[] args){string str = "当前时间是";Task t1 = Task.Run(() => ThreadFuc1(str));Task t2 = Task.Run(() => ThreadFuc2(str));Task.WaitAny(t1,t2);t1.ContinueWith(task =>{Console.WriteLine($"任务完成时的状态:IsCanceled={task.IsCanceled}\tIsCompleted={task.IsCompleted}\tIsFaulted={task.IsFaulted}");});Task.WaitAll(t1,t2);//等待所有任务结束 Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Console.ReadKey();}public static void ThreadFuc1(string str){Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);}public static void ThreadFuc2(string str){Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(2000);}

这里分别开启了两个线程t1、t2,在t1里面等待1秒,t2里面等待2秒,所以执行WaitAny时先等到ti完成,WaitAll时会等到t2完成.最终输出结果如下:

b292c8c9962e6e20c17a6cb6d8819282.png

④RunSynchronously:同步启动,对当前的 System.Threading.Tasks.Task 同步运行 System.Threading.Tasks.TaskScheduler。(类似委托开启线程,BeginInvoke是异步,而Invoke是同步)

用法:

Task t1 = new Task(() => ThreadFuc1(str));Task t2 = new Task(() => ThreadFuc2(str));t1.RunSynchronously();t2.RunSynchronously();

012c5cb8cd2197afbaa23808f5335243.png

⑤Wait:等待 System.Threading.Tasks.Task 完成执行过程。

⑥Start:启动 System.Threading.Tasks.Task,并将它安排到当前的 System.Threading.Tasks.TaskScheduler中执行;

带返回值的使用方式:

static void Main(string[] args){string str = "当前时间是";Task<int> t1 = new Task<int>(() => ThreadFuc1(str));Task<int> t2 = new Task<int>(() => ThreadFuc2(str));t1.Start();t2.Start();Task.WaitAny(t1,t2);t1.ContinueWith(task =>{Console.WriteLine($"任务完成时的状态:IsCanceled={task.IsCanceled}\tIsCompleted={task.IsCompleted}\tIsFaulted={task.IsFaulted}");});Task.WaitAll(t1,t2);//等待所有任务结束 int result1 = t2.Result;int result2 = t2.Result;Console.WriteLine($"result1值是{result1},result2值是{result2}");Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Console.ReadKey();}public static int ThreadFuc1(string str){Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(1000);return 1;}public static int ThreadFuc2(string str){Console.WriteLine($"线程Id是{Thread.CurrentThread.ManagedThreadId},{str}:{DateTime.Now}");Thread.Sleep(2000);return 2;}

运行结果如下:

23af0f8caf887140c1808d4e62438ac7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数调用堆栈图

转载于:https://www.cnblogs.com/DeeLMind/p/7617972.html

Session的原理,大型网站中Session方面应注意什么?

一、Session和Cookie的区别 Session是在服务器端保持会话数据的一种方法&#xff08;通常用于pc端网站保持登录状态&#xff0c;手机端通常会使用token方式实现&#xff09;&#xff0c;存储在服务端。 Cookie是在客户端保持用户数据&#xff0c;存储位置是客户端&#xff08…

两圆相交求面积 hdu5120

转载 两圆相交分如下集中情况&#xff1a;相离、相切、相交、包含。 设两圆圆心分别是O1和O2&#xff0c;半径分别是r1和r2&#xff0c;设d为两圆心距离。又因为两圆有大有小&#xff0c;我们设较小的圆是O1。 相离相切的面积为零&#xff0c;代码如下&#xff1a; [cpp] view …

Python_list部分功能介绍

x.append():在列表尾部添加一个元素 x.clear():把列表清空 x.count():判断某个元素出现的次数 x.extend():合并两个列表&#xff0c;或者一个元组 x.index():获取元素下标 x.insert():指定下标添加元素 x.pop():移除某一元素&#xff0c;移除的元素可获取 x.remove():移除指定的…

一招解决开发环境问题 —— 远程容器开发指南

前言使用C作为主要开发语言的程序猿们应该会认同搭建开发环境是一件烦人的事情。为了编译一个程序不仅需要下载各种依赖包&#xff0c;还可能面临本地系统不兼容、编译器版本不一致、包版本冲突等各种问题。笔者在运营iLogtail开源社区的过程中发现开发和调试环境问题也是成员问…

UITabBarController的基本原理及使用(一)

前言 UITabBarController在iOS开发中是一个高频使用的控制器&#xff0c;典型的案例如QQ、微信均使用UITabBarController布局。本文将从一个新建工程&#xff0c;和大家一起了解UITabBarController的基本原理和使用方法。 基本概念 UITabBarController能够方便地管理多个控制器…

C# 多线程ThreadPool用法举例

概述ThreadPool是.Net Framework 2.0版本中出现的。自从Task出来以后&#xff0c;ThreadPool已经很少用了&#xff0c;但是一些老的代码或者一些古老的程序猿还是会用到他&#xff0c;所以我们可以不用它&#xff0c;但是还是有必须学习和了解他.ThreadPool用法举例static void…

Mysql实现主从复制(一主双从)

一、环境介绍 LNMP&#xff08;centos7&#xff0c;mysql5.6&#xff09; vmware workstation pro配置了3个虚拟机&#xff0c;均安装了LNMP环境&#xff1a; master&#xff1a; 192.168.0.105 slave&#xff1a; 192.168.0.106 、192.168.0.107 二、原理 &a…

接口文档神器Swagger(下篇)

本文来自网易云社区作者&#xff1a;李哲二、Swagger-springmvc原理解析上面介绍了如何将springmvc和springboot与swagger结合&#xff0c;通过简单配置生成接口文档&#xff0c;以及介绍了swagger提供的一些注解。下面将介绍swagger是如何做到与springmvc结合&#xff0c;自动…

利用python进行数据分析D1——ch02引言

基础的课程还没学完&#xff0c;就来这本了&#xff0c;因为我平时的研究还是以数据的处理为主。把自己的事做好做细致读了一下介绍部分&#xff0c;下载书里用到的数据&#xff0c;下载地址&#xff1a;https://github.com/wesm/pydata-book 如果你需要完成以下几大类任务&…

记一次Memory Leak分析

起因&#xff1a;最近公司的一个web产品遇到了内存溢出&#xff0c;于是开始着手调查。调查&#xff1a;首先当务之急是找到那个或那些API导致Memory Leak&#xff0c;这个应该不难&#xff0c;根据监控分析&#xff0c;在内存上升时间段内有哪些API被访问&#xff0c;再就是根…

WebSocket教程

一、为什么需要 WebSocket&#xff1f; 初次接触 WebSocket 的人&#xff0c;都会问同样的问题&#xff1a;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f; 答案很简单&#xff0c;因为 HTTP 协议有一个缺陷&#xff1a…

C# WPF十个美观的界面设计展示

概述很多时候&#xff0c;我们设计的界面总是感觉缺乏美感&#xff0c;不是我们不会开发好看的界面&#xff0c;而是不知道怎么才算美观&#xff0c;这时候我们不妨看看别人好的页面是怎么做的.下面展示一些我觉得做的比较好的cs界面&#xff0c;希望能给大家在平时做界面设计时…

MySQL5.6二进制软件包编译安装详解(三)

一、软件环境 [rootlocalhost ~]# uname -r 3.10.0-862.el7.x86_64 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 二、安装部署过程详解 MySQL安装3种方式&#xff1a;1>rpm包安装应用文件默认安装在/usr/local 目录下2>源码编译需…

使用autok3s 安装k3s 集群 和 kuboard 管理集群

一、k3s介绍1.1 什么是k3s?k3s 是经过 CNCF 认证的由 Rancher 公司开发维护的一个轻量级的 Kubernetes 发行版&#xff0c;内核机制还是和 k8s 一样&#xff0c;但是剔除了很多外部依赖以及 K8s 的 alpha、beta 特性&#xff0c;同时改变了部署方式和运行方式&#xff0c;目的…

社区纠纷不断:程序员何苦为难程序员

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)今年年初&#xff0c;我们报道“因为被多人侮辱大吼&#xff0c;Swift 之父正式退出 Swift 核心团队”。诸如此类的“语言暴力”、“网络暴力”事件在开源社区乃至整个 IT 社区屡见不鲜。多个技术社区&#xff0c;都出…

PHP 分布式集群中session共享问题以及session有效期的设置

一、Session的原理 以下以默认情况举例&#xff1a; session_start();之后&#xff0c;会生成一个唯一的session_id&#xff0c;每一个用户对应唯一一个session_id&#xff0c;每一个session_id对应服务器端的一个session文件。这个session文件存储着当前session_id的信息&am…

[SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

全网唯一一篇容斥题解 Description Solution 看到这个题&#xff0c;大部分人想的是状压dp 但是我是个蒟蒻没想到&#xff0c;就用容斥切掉了。 并且复杂度比一般状压低&#xff0c; &#xff08;其实这个容斥的算法&#xff0c;提出来源于ywy_c_asm&#xff09; &#xff08;然…

对象存储OSS服务

一、oss是什么 阿里云对象存储服务&#xff08;Object Storage Service&#xff0c;简称OSS&#xff09;为您提供基于网络的数据存取服务。使用OSS&#xff0c;您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。 阿里云OSS将数据文件以…

《Access 2007开发指南(修订版)》一一1.5 什么是数据库对象

本节书摘来自异步社区出版社《Access 2007开发指南(修订版)》一书中的第1章&#xff0c;第1.5节&#xff0c;作者&#xff1a; 【美】Alison Balter&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 什么是数据库对象 Access 2007开发指南(修订版)正如前…