ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#任务并行库TPL--Task应用

2022-07-15 17:32:01  阅读:155  来源: 互联网

标签:Task cts C# longTask TPL 任务 new TaskMethod


一、概念

  TPL的核心就是任务,一个任务代表一个异步操作,该操作可以通过多种方式运行,一个任务也可以由多个任务组成。

二、应用

1、创建任务有三种方法:  

var t1 = new Task(() => TaskMethod("Task 1"));                //通过Task构造函数创建
var t2 = new Task(() => TaskMethod("Task 2"));
t2.Start();                                     //需要手动启动
t1.Start();                                    
Task.Run(() => TaskMethod("Task 3"));                     //Task.Run()可以自启动
Task.Factory.StartNew(() => TaskMethod("Task 4"));             //Task.Factory.StartNew()相对于前者要可以添加附加选项,如下添加了标记任务为长时间运行
Task.Factory.StartNew(() => TaskMethod("Task 5"),TaskCreationOptions.LongRunning);
Sleep(TimeSpan.FromSeconds(1));
Console.ReadKey();

 

 创建的任务都会被放入线程池,而且没有指定顺序。Task 5 经过标记后,不会使用线程池。

2、基本操作

Task<int> task = new Task<int>(()=>TaskMethod(name));

task.RunSynchronously();
//通过该方法运行的任务会运行在主线程上,可以避免使用线程池来执行非常短暂的操作
firstTask.ContinueWith(t => WriteLine();
// 该代码表示当firstTask这个任务的一个后续操作,在当前任务完成后运行

Task continuation = secondTask.ContinueWith(t => WriteLine(...,
     TaskContinuationOptions.OnlyOnRanToCompletion| TaskContinuationOptions.ExecuteSynchronously);
//TaskContinuationOptions.OnlyOnRanToCompletion| TaskContinuationOptions.ExecuteSynchronously
//用来尝试同步后续操作

创建子任务:

firstTask = new Task<int>(() =>
            {
                var innerTask = Task.Factory.StartNew(() => TaskMethod(
                    "Second Task", 5), TaskCreationOptions.AttachedToParent);
                innerTask.ContinueWith(t => TaskMethod("Third Task", 2),
                    TaskContinuationOptions.AttachedToParent);
                return TaskMethod("First Task", 2);
            });
            //上述TaskCreationOptions.AttachedToParent运行了一个子任务
            //通过TaskContinuationOptions.AttachedToParent给子任务一个后续操作,该操作会影响到父任务
            //因为父任务必须等到所有的子任务结束它才会运行完

取消操作:

        var cts = new CancellationTokenSource();
            var longTask = new Task<int>(() => TaskMethod("Task 1", 10, cts.Token), cts.Token);
            WriteLine(longTask.Status);
            cts.Cancel();                                      //此时状态为Canceled
            //longTask.Start();
            WriteLine(longTask.Status);
            WriteLine("First task has been cancelled before execution");

            cts = new CancellationTokenSource();
            longTask = new Task<int>(() => TaskMethod("Task 2", 10, cts.Token), cts.Token);
            longTask.Start();
            for (int i = 0; i < 5; i++)
            {
                Sleep(TimeSpan.FromSeconds(0.5));
                WriteLine(longTask.Status);
            }
            cts.Cancel();                                      //此时任务的状态变为RanToCompletion
            //longTask.Start();
            for (int i = 0; i < 5; i++)
            {
                Sleep(TimeSpan.FromSeconds(0.5));
                WriteLine(longTask.Status);
            }

 

标签:Task,cts,C#,longTask,TPL,任务,new,TaskMethod
来源: https://www.cnblogs.com/Darius0821/p/16481570.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有