C# 基础 之:Task 用法

参考来源:https://www.cnblogs.com/zhaoshujie/p/11082753.html

他介绍的可以说是非常详细,附带Demo例子讲解

1、入门

Task看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。以下是一个简单的任务示例:

微软官网 Task 参数介绍 Task

简单例子:
Task t = new Task(() =>
{
    Console.WriteLine("任务开始工作……");
    Thread.Sleep(2);  //模拟工作过程
});
t.Start();
// ContinueWith表示:创建一个在目标 Task 完成时可接收取消标记并以异步方式执行的延续任务。
t.ContinueWith(task =>
{
    Console.WriteLine("任务完成,完成时候的状态为:");
    Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}",
                      task.IsCanceled, task.IsCompleted, task.IsFaulted);
    //IsCanceled https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task.iscanceled?view=net-6.0
    //另外的:IsCompletedSuccessfully ==> true 如果任务已运行完成,则为否则 false。
});
Console.ReadKey();
TaskFactory

TaskFactory工厂创建

// 方法1. TaskFactory工厂
TaskFactory taskFactory = new TaskFactory() ;
taskFactory.StartNew(() => TaskTest("Task 3"));
// 方法2. Task.Factory属性
Task.Factory.StartNew(() => TaskTest("Task 3"));
//或者
var t3=Task.Factory.StartNew(() => TaskTest("Task 3"));
Task.WaitAll(t3);
带返回值的Task
Task<int> task = xx Task<int>()方法;
task.Start();
int result = task.Result;
线程等待、延续和组合

Wait:针对单个Task的实例,可以task1.wait进行线程等待
WaitAny:线程列表中任何一个线程执行完毕即可执行(阻塞主线程)
WaitAll:线程列表中所有线程执行完毕方可执行(阻塞主线程)
WhenAny:与ContinueWith配合,线程列表中任何一个执行完毕,则继续ContinueWith中的任务(开启新线程,不阻塞主线程)
WhenAll:与ContinueWith配合,线程列表中所有线程执行完毕,则继续ContinueWith中的任务(开启新线程,不阻塞主线程)
ContinueWith:与WhenAny或WhenAll配合使用
ContinueWhenAny:等价于Task的WhenAny+ContinueWith
ContinueWhenAll:等价于Task的WhenAll+ContinueWith

、 CancellationTokenSource

微软官网文档:CancellationTokenSource
CancellationTokenSource的功能不仅仅是取消任务执行,我们可以使用 source.CancelAfter(5000)实现5秒后自动取消任务,也可以通过 source.Token.Register(Action action)注册取消任务触发的回调函数,即任务被取消时注册的action会被执行

例子:
 CancellationTokenSource source = new CancellationTokenSource();
            //注册任务取消的事件
            source.Token.Register(() =>
            {
                Console.WriteLine("任务被取消后执行xx操作!");
            });

            int index = 0;
            //开启一个task执行任务
            Task task1 = new Task(() =>
              {
                  while (!source.IsCancellationRequested)
                  {
                      Thread.Sleep(1000);
                      Console.WriteLine($"第{++index}次执行,线程运行中...");
                  }
              });
            task1.Start();
            //延时取消,效果等同于Thread.Sleep(5000);source.Cancel();
            source.CancelAfter(5000);
            Console.ReadKey();

image

CancellationTokenSource
posted @ 2022-08-29 22:48  Bo-Hong  阅读(1986)  评论(0编辑  收藏  举报