Task在并行计算中的作用很凸显,但是他的使用却有点小复杂,下面是任务的一些基本使用说明(转载与总结于多篇文章)
简单点说说吧!
创建 Task
创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建。如下代码所示
一.使用构造函数创建Task
Task t1 = new Task(MyMethod);
二.使用Task.Factory.StartNew 进行创建Task
Task t1 = Task.Factory.StartNew(MyMethod);
其实方法一和方法二这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,也许会在后面的文章细说。
也可参考下面的方法:
Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); });
Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); });

Task t3 = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i is " + i);
Thread.Sleep(1000);
}
});
Console.WriteLine("t3:"+t3.Status);
Thread.Sleep(10);
Console.WriteLine("t3:"+t3.Status);
Task.WaitAll(t3);

Task t4 = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ii is " + i);
Thread.Sleep(1000);
}
});

每个方法自己运行一遍也就知道了。这里就不解释了。
1、首次构造一个Task对象时,他的状态是Created。
2、当任务启动时,他的状态变成WaitingToRun。
3、Task在一个线程上运行时,他的状态变成Running。
4、任务停止运行,等待他的任何子任务时,状态变成WaitingForChildrenToComplete。
5、任务完全结束时,它进入以下三个状态之一:RanToCompletion,Canceled或者Faulted。
6、一个Task<TResult>运行完成时,可通过Task<TResult>的Result属性来查询任务的结果,
7、一个Task或者Task<TResult>出错时,可以查询Task的Exception属性来获得任务抛出的未处理的异常,该属性总是返回一个AggregateException对象,他包含所有未处理的异常。
8、为简化代码,Task提供了几个只读的Boolean属性,IsCanceled,IsFaulted,IsCompleted。
9、注意,当Task处于RanToCompleted,Canceled或者Faulted状态时,IsCompleted返回True。
10、为了判断一个Task是否成功完成,最简单的方法是:if(task.Status == TaskStatus.RanToCompletion)。
11、task的ContinueWith方法用于在一个任务完成后发起一个新任务。
12、任务的启动、停止与异常处理
(1)任务的启动:
CancellationTokenSource cts = new CancellationTokenSource();
Task task = new Task(() => ThreadGetData(cts.Token), cts.Token);
private void ThreadGetData(CancellationToken ct)//ThreadGetData是自己的一个方法,用于每分钟读取一次数据
{
ReadDataOneMinite(ct);
}
task.Start();//任务启动
(2)任务的停止:
任务和线程并不是调用者想停止就能停止的,正确停止线程更多地在于工作线程是否能主动响应调用者的停止请求。在基于Task的任务执行过程中,我们通常使用CancellationTokenSource来实现任务取消。CancellationTokenSource 是一种名为“取消标记”的轻型对象,用于线程和任务的协作取消。线程和任务在工作的同时,会以某种频率检测CancellationTokenSource的IsCancellationRequested标识,若检测到IsCancellationRequested,线程自己负责退出。下面是线程取消的一段代码示例:
CancellationTokenSource
cts =
new CancellationTokenSource();
Task task =
new Task(()
=>
{
while (true)
{
if (cts.Token.IsCancellationRequested)//如果检测到取消请求
{
Console.WriteLine("线程被终止!");
break;
}
//否则执行某工作
ReadDataOneMinite(ct);//用于每分钟读取一次数据
Thread.Sleep(60000);
}
});
task.Start();
cts.Cancel();//任务取消
调用者使用CancellationTokenSource的Cancle方法通知工作线程退出。工作线程则以大致60000毫秒的频率一边工作,一边检查是否有外界传入进来的Cancel信号。若有这样的信号,则负责退出。协作式取消中的关键类型是CancellationTokenSource。它有一个关键属性Token,Token是一个名为CancellationToken的值类型。CancellationToken继而进一步提供了布尔值的属性IsCancellationRequested作为需要取消工作的标识。
(3)任务的异常处理:
CancellationTokenSource cts
=
new CancellationTokenSource();
Task
task =
new Task(()
=>
{
while (true)
{
if (cts.Token.IsCancellationRequested)//如果检测到取消请求
{
cts.Token.ThrowIfCancellationRequested();//异常处理来退出程序,但CLR知道这一行是程序员有意为之,所以并不
把它当做一个异常(它被理解为取消)
break;
}
//否则执行某工作
ReadDataOneMinite(ct);//用于每分钟读取一次数据
Thread.Sleep(60000);
}
});
以上是一些简单的使用方式,待工作中深入应用后再进行补充任务的其他使用。
 
参考:
https://www.cnblogs.com/wjcnet/p/6955756.html
https://blog.csdn.net/minminsu/article/details/18659889

C#中Task的使用简单总结的更多相关文章

  1. SQL Server 2012中Task是如何调度的?

    SQL Server 2012中Task是如何调度的?[原文来自:How It Works: SQL Server 2012 Database Engine Task Scheduling]     ...

  2. .Net中Task使用来提高代码执行效率

    技术不断更新迭代,更高效的执行效率越来越被重视,所以对Task的使用进行了简单使用做了整理与大家分享. .Net 中有了Task后使多线程编程更简单使用和操作,下面粘上代码进行简单说明: /// &l ...

  3. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

  4. java中Color类的简单总结

    java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...

  5. Linux 中 Vi 编辑器的简单操作

    Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi  filename //打开或新 ...

  6. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  7. 【原】 Spark中Task的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...

  8. spring注解开发中常用注解以及简单配置

    一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...

  9. 浏览器中 F12 功能的简单介绍

    chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...

随机推荐

  1. Java基础-面向对象(08)

    面向过程 完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现.一步一步去实现,而具体的每一步都需要我们去实现和操作.这些步骤相互调用和协作,完成我们的需求.面向过程开发 ...

  2. 『Sklearn』特征向量化处理

    『Kaggle』分类任务_决策树&集成模型&DataFrame向量化操作 1 2 3 4 5 6 7 8 9 '''特征提取器''' from sklearn.feature_extr ...

  3. POJ-3009 Curling 2.0 (DFS)

    Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But th ...

  4. $LANG、$NLS_LANG 记录一下

    环境:linux $LANG 为linux termal终端环境下的 语言环境 $NLS_LANG  为oracle数据库中 会话中的语言环境. 个人理解,望大家补充

  5. linux下常用的截图、录屏工具

    录屏: 在linux下常用的录屏工具有5种,可以baidu或者google下喔,我选用的是recordMydesktop,使用非常方便,用时注意先把每秒桢数调高,否则效果必然很差. 在ubuntu下可 ...

  6. C# 字符串 相关操作

    你或许知道你能使用String.Trim方法去除字符串的头和尾的空格,不幸运的是. 这个Trim方法不能去除字符串中间的C#空格. static void Main()         {       ...

  7. SPOJ AMR10I 递归

    DES :给你n 块石头.不会超过70.把它们分成n堆.每堆里的石头数做积.问共有多少个数.最终的结果除了1之外都能分解成素数相乘或者素数相乘再乘1.所以可以找到所有不超过70的素数然后进行深搜. 感 ...

  8. asp.net文件压缩,下载,物理路径,相对路径,删除文件

    知识动手实践一次,就可以变成自己的了.不然一直是老师的,书本的. 这几天做了一个小小的项目,需要用到文件下载功能,期初想到只是单个的文件,后面想到如果很多文件怎么办?于是又想到文件压缩.几经波折实践, ...

  9. L1-005 考试座位号

    每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考 ...

  10. DevExpress v18.1新版亮点——WinForms篇(六)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...