C#中Task的使用简单总结

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);html

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



每一个方法本身运行一遍也就知道了。这里就不解释了。

一、首次构造一个Task对象时,他的状态是Created。
二、当任务启动时,他的状态变成WaitingToRun。
三、Task在一个线程上运行时,他的状态变成Running。
四、任务中止运行,等待他的任何子任务时,状态变成WaitingForChildrenToComplete。
五、任务彻底结束时,它进入如下三个状态之一:RanToCompletion,Canceled或者Faulted。
六、一个Task<TResult>运行完成时,可经过Task<TResult>的Result属性来查询任务的结果,
七、一个Task或者Task<TResult>出错时,能够查询Task的Exception属性来得到任务抛出的未处理的异常,该属性老是返回一个AggregateException对象,他包含全部未处理的异常。
八、为简化代码,Task提供了几个只读的Boolean属性,IsCanceled,IsFaulted,IsCompleted。
九、注意,当Task处于RanToCompleted,Canceled或者Faulted状态时,IsCompleted返回True。
十、为了判断一个Task是否成功完成,最简单的方法是:if(task.Status == TaskStatus.RanToCompletion)。
十一、task的ContinueWith方法用于在一个任务完成后发起一个新任务。
十二、任务的启动、中止与异常处理
(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
相关文章
相关标签/搜索