2 Task中的延续和7种阻塞
1.wait
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
//阻塞 wait 有点像thread的join 作用是Task执行完 这个wait之后的代码才可以执行
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait");
});
t1.Start();
t1.Wait();
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
2.WaitAll
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start(); Task.WaitAll(t1, t2);
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
先输出 我是wait2 再输出 我是wait1 最后输出 我是主线程
3.WaitAny
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start(); Task.WaitAny(t1, t2);
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
先输出 我是wait2 再输出 我是主线程 最后输出 我是wait1
4 whenAll +延续
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start(); Task.WhenAll(t2, t1).ContinueWith(t3=> {
Console.WriteLine("我是t3,一个新的线程");
});
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
我是主线程
我是wait2
我是wait1
我是t3,一个新的线程
5 whenAny +延续
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start();
//跟上一个代码的区别是 上一个是whenAll 这个是whenAny
Task.WhenAny(t2, t1).ContinueWith(t3=> {
Console.WriteLine("我是t3,一个新的线程");
});
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
我是主线程
我是wait2
我是t3,一个新的线程
我是wait1
6 Task.Factory的whenAll阻塞和延续
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start();
//注意的是 这里是factory 上面两个线程也要start
Task.Factory.ContinueWhenAll(new Task[] { t1, t2 }, t =>
{
Console.WriteLine("factory 中的when All");
});
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
我是主线程
我是wait2
我是wait1
factory 中的when All
7 Task.Factory的whenAny阻塞和延续
using System;
using System.Threading;
using System.Threading.Tasks; namespace 多线程_List
{
class Program
{
static void Main(string[] args)
{
//Task中的延续和7种阻塞
Task t1 = new Task(()=> {
Thread.Sleep();
Console.WriteLine("我是wait1");
});
t1.Start(); Task t2 = new Task(() => {
Thread.Sleep();
Console.WriteLine("我是wait2");
});
t2.Start();
//注意的是 这里是factory 上面两个线程也要start
Task.Factory.ContinueWhenAny(new Task[] { t1, t2 }, t =>
{
Console.WriteLine("factory 中的when Any");
});
Console.WriteLine("我是主线程");
Console.ReadKey(); } }
}
我是主线程
我是wait2
factory 中的when Any
我是wait1
2 Task中的延续和7种阻塞的更多相关文章
- C#中实现并发的几种方法的性能测试
C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...
- Android中实现定时器的四种方式
第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...
- C# Task中的Func, Action, Async与Await的使用
在说Asnc和Await之前,先说明一下Func和Action委托, Task任务的基础的用法 1. Func Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate, ...
- 在Android开发中,定时执行任务的3种实现方法
在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...
- 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念
开篇介绍 在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型. 同步与异步 Synchronous and Asynchr ...
- 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧
开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...
- javaSE中JDK提供的四种线程池
对javaSE中JDK提供的四种线程池稍作整理 一.Executor package java.util.concurrent; /** * @since 1.5 * @author Doug ...
- 编写高质量代码改善C#程序的157个建议——建议85:Task中的异常处理
建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序 ...
- ASP.Net Core中处理异常的几种方法
本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...
随机推荐
- SQL Server 2008 Tempdb 数据库迁移
1.首先检查数据文件位置及名称 SELECT name,physical_name FROM sys.database_files 2.迁移 USE master; GO ALTER DATABASE ...
- ArcGlobe三维开发之十九——GlobeControl与MapControl的二三维联动
实现思路:2D->3D,将当前MapControl的可视范围设置为GlobeControl中Extent属性的值:3D--->2D.获取当前GlobeControl的target和obse ...
- minizlib
ZLIB开源库采用的是DEFLATE压缩算法,已经不支持加密功能,实际上功能还存在于代码中,采用MINIZIP可以支持对ZIP文件的加解密. ZLIB目前最新的是1.2.7,MINIZIP最新的版本是 ...
- hdu Minimum Transport Cost(按字典序输出路径)
http://acm.hdu.edu.cn/showproblem.php? pid=1385 求最短路.要求输出字典序最小的路径. spfa:拿一个pre[]记录前驱,不同的是在松弛的时候.要考虑和 ...
- Vim常用匹配、查找、替换命令总结
以前都是从头开始找,最近处理log文件很多. 在vim 中输入 :1?XXXX 1的意思是文件的第一行 ?的意思是反向查找 XXXX就是你要找的关键字 更新:Linux 从末尾开始查找日志 tac c ...
- 11G、12C安装结束需要做的一些操作
修改spfile参数:修改前,先备份 create pfile from spfile; alter system set memory_target=0 scope=spfile;alter sys ...
- java并发api总结
开发十年,就只剩下这套架构体系了! >>> 1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Ru ...
- Android 添加常驻图标到状态栏
/ * * 如果没有从状态栏中删除ICON,且继续调用addIconToStatusbar,则不会有任何变化.如果将notification中的resId设置不同的图标,则会显示不同的图标 * / p ...
- SRA解密报错:Data must start with zero
项目背景:要对打印地址进行加密,用公钥加密后会乱码需要base64 decode一下,但是在解密时报错:javax.crypto.BadPaddingException: Data must star ...
- 【u025】贝茜的晨练计划
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 <= ...