由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来。
System.Threading.Tasks的作用:
Tasks命名空间下的类试图使用任务的概念来解决线程处理的复杂问题。任务(Task)包含一个操作,以及依赖哪个任务的完成才能开始。
测试用例:
假设有任务A,B,C,D。其中C依赖A和B的完成,而D依赖A的完成。代码该怎么写呢?
代码:
1 TaskFactory factory = new TaskFactory();
2 Task a = factory.StartNew((new TestAction("A", 2)).Do);
3 Task b = factory.StartNew((new TestAction("B", 5)).Do);
4 Task c = factory.ContinueWhenAll(new Task[] { a, b }, ((preTasks) => (new TestAction("C",1)).Do()));
5 Task d = factory.ContinueWhenAll(new Task[] { a }, ((preTasks) => (new TestAction("D",1)).Do()));
2 Task a = factory.StartNew((new TestAction("A", 2)).Do);
3 Task b = factory.StartNew((new TestAction("B", 5)).Do);
4 Task c = factory.ContinueWhenAll(new Task[] { a, b }, ((preTasks) => (new TestAction("C",1)).Do()));
5 Task d = factory.ContinueWhenAll(new Task[] { a }, ((preTasks) => (new TestAction("D",1)).Do()));
测试任务类:
1 public class TestAction
2 {
3 public TestAction(string actionName,int p)
4 {
5 _actionName = actionName;
6 _p = p;
7 }
8
9 private int _p;
10 private string _actionName;
11 public void Do()
12 {
13 Console.WriteLine("开始执行" + _actionName);
14 Thread.Sleep(new TimeSpan(0, 0, _p));
15 Console.WriteLine("执行完毕" + _actionName);
16 }
17 }
2 {
3 public TestAction(string actionName,int p)
4 {
5 _actionName = actionName;
6 _p = p;
7 }
8
9 private int _p;
10 private string _actionName;
11 public void Do()
12 {
13 Console.WriteLine("开始执行" + _actionName);
14 Thread.Sleep(new TimeSpan(0, 0, _p));
15 Console.WriteLine("执行完毕" + _actionName);
16 }
17 }
需要注意的是,StartNew方法将立即执行,并不会等待后续的任务加入后才开始,这个是让我刚开始学习时很困惑的。而且StartNew方法不是一个同步方法,这意味着将立即执行后面的语句,因此,我们也就模拟出了任务A和B”同时”执行的现象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2007-03-29 关于Flex2的资料
2007-03-29 关于扩展Visual Studio 2005的相关资料