C#任务并行库TPL--Task应用
2022/7/16 1:22:50
本文主要是介绍C#任务并行库TPL--Task应用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、概念
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); }
这篇关于C#任务并行库TPL--Task应用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#