.NET 4.0 System.Threading.Tasks学习笔记
2024-10-16 11:23:14
由于工作上的需要,学习使用了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()));
测试任务类:
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 }
需要注意的是,StartNew方法将立即执行,并不会等待后续的任务加入后才开始,这个是让我刚开始学习时很困惑的。而且StartNew方法不是一个同步方法,这意味着将立即执行后面的语句,因此,我们也就模拟出了任务A和B”同时”执行的现象。
最新文章
- django(3) 一对多跨表查询、ajax、多对多
- Ruby Gem命令详解
- Codeforces Round #259 (Div. 2)
- QT常规控件操作备忘
- MySQL-Front 建表引发的一点小思考(数据表格模版)
- Android设置按钮为透明
- 【T电商 3】Nginx的Http(图片)服务器配置+ftp上传使用说明
- 在XP下把win7安装到VHD,内存足够大可以RAMOS
- Python ~~~ 面向对象的利器
- truncate、drop、delete区别
- error: variable '__this_module' has initializer but incomplete type错误解决
- sealed 密封类,不能被其他类继承,但可以继承其他类
- (转)用Eclipse编译你的ROS程序
- Oracle BigFile
- 使用plist的好处
- Android平台下使用lua调用Java代码经验总结
- 【原】Java学习笔记028 - 集合
- kibana 创建index pattern 索引模式时过慢导致无法创建成功 以及解决方案
- MyEclipse设置编码格式
- vue响应式原理
热门文章
- ScrollPic.js——图片左右滚动插件
- CentOS yum update 与 yum upgrade 区别
- BZOJ——1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏
- STM32 GPIO寄存器 IDR ODR BSRR BRR
- 四则运算表达式树 C++模板 支持括号和未知数
- oracle存储过程中使用字符串拼接
- 推荐几款屏幕录制工具(可录制GIF)
- 【PostgreSQL】安装使用步骤
- remove_if的问题
- Android实现SQLite数据库的增、删、改、查的操作