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种阻塞的更多相关文章

  1. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  2. Android中实现定时器的四种方式

    第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...

  3. C# Task中的Func, Action, Async与Await的使用

    在说Asnc和Await之前,先说明一下Func和Action委托, Task任务的基础的用法 1. Func Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate, ...

  4. 在Android开发中,定时执行任务的3种实现方法

    在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...

  5. 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念

    开篇介绍 在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型. 同步与异步 Synchronous and Asynchr ...

  6. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

  7. javaSE中JDK提供的四种线程池

    对javaSE中JDK提供的四种线程池稍作整理   一.Executor   package java.util.concurrent; /** * @since 1.5 * @author Doug ...

  8. 编写高质量代码改善C#程序的157个建议——建议85:Task中的异常处理

    建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序 ...

  9. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

随机推荐

  1. js实现第一次打开网页弹出指定窗口(常用功能封装很好用)

    js实现第一次打开网页弹出指定窗口(常用功能封装很好用) 一.总结 1.常用功能封装:之前封装的cookie的操作函数非常好用,我自己也可以这么搞 二.js实现第一次打开网页弹出指定窗口 练习1:第一 ...

  2. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  3. c#.net公共帮助类

    c#.net公共帮助类 比较全面的c#帮助类 比较全面的c#帮助类,日常工作收集,包括前面几家公司用到的,各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目,分 ...

  4. SQL日期时间函数

    一.Sql Server中的日期与时间函数 1. 当前系统日期.时间  select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值  例如 ...

  5. Java的压缩、解压及压缩加密、解密解压 样例

    为了节约带宽.加快传送速度,http协议支持gzip的压缩,但假设我们的app与后台不是通过http协议通讯的.那么压缩.解压这个流程须要自己写.以下给出compress和decompress的代码: ...

  6. swift学习第十二天:类的属性定义

    类的属性介绍 Swift中类的属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作为类实例的一部分, ...

  7. php课程 3-12 带默认参数的函数怎么写

    php课程 3-12 带默认参数的函数怎么写 一.总结 一句话总结:多看学习视频啊 1.带默认参数的函数怎么写? 直接等于号接默认参数,和js里面一模一样 2.带默认参数的函数的注意事项是什么? 默认 ...

  8. JavaScript的return程序流

    原文 简书原文:https://www.jianshu.com/p/cd65a26a5b0c 大纲 1.场景分析 2.代码分析 3.总结分析 1.场景分析 以下有两段代码,这两段代码都可以使用检查输入 ...

  9. iOS中拉伸图片的几种方式

    假如下面的一张图片,是用来做按钮的背景图片的,原始尺寸是(128 * 112) 按钮背景图片.png 我们通过代码将这张图片设置为按钮的背景图片,假如我们将创建好的按钮的宽高设置为:(W=200, H ...

  10. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...