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

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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#的多线程任务(Task)是一种用于并行和异步编程的重要机制。它允许我们在应用程序创建并发任务,从而提高性能和响应性。 在C#,我们可以使用Task类来创建和管理多线程任务。以下是使用Task进行多线程编程的一般步骤: 1. 创建一个Task对象:我们可以使用Task类的静态方法来创建一个任务。例如,可以使用Task.Run方法创建一个简单的任务。示例代码如下: ```csharp Task task = Task.Run(() => { // 在此处执行任务操作 }); ``` 2. 定义任务操作:在创建任务时,我们通常需要定义要在任务执行的操作。可以使用lambda表达式或方法来指定任务操作。示例代码如下: ```csharp Task task = Task.Run(() => { // 在此处执行任务操作 }); ``` 3. 等待任务完成:如果需要等待任务完成,可以使用Task类的Wait方法或await关键字。这样可以确保在继续执行后续代码之前,任务已经完成。示例代码如下: ```csharp Task task = Task.Run(() => { // 在此处执行任务操作 }); task.Wait(); // 等待任务完成 // 或者使用 await 关键字: await task; ``` 4. 处理任务结果:如果任务有返回值,我们可以使用Task<T>泛型类来创建带返回值的任务,并通过Result属性获取任务的结果。示例代码如下: ```csharp Task<int> task = Task.Run(() => { // 在此处执行任务操作并返回结果 return 42; }); int result = task.Result; // 获取任务的结果 ``` 总结起来,使用C#Task类可以方便地实现多线程编程。我们可以创建、定义和等待任务,并处理任务的结果。这样可以实现并行执行任务,提高应用程序的性能和响应性。 提供了一个基于C#开发的工具类库(MSCL超级工具类库),其包括了很多常用工具类的封装。虽然它没有提到Task类,但我们可以借助C#的多线程编程机制来实现并发任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值