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. ios根据字体大小设置

    , , , , , , , , , , , }; //这么多字体,从大到小挨个尝试 ; UIFont *font; ; i < array_length; i++) { font = [font ...

  2. gvim 窗口最大化启动

    此文来源于vimer的程序世界 首先需要 gvimfullscreen.dll 文件  下载gvimfullscreen.dll 下载源码 之后只需要在vimrc中配置如下代码就可以按F11使Vim全 ...

  3. 快速杀死占用8080端口进程的批处理(kill-8080.bat)

    @echo off setlocal enabledelayedexpansion for /f "delims= tokens=1" %%i in ('netstat -aon ...

  4. Swift - 警告提示框(UIAlertController)的用法

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  5. 是男人就下100层【第四层】——Crazy贪吃蛇(3)

    上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(2)>实现了贪吃蛇绕着屏幕四周移动,这一篇我们来完成贪吃蛇的所有功能. 一.随机产生苹果 private void addAppl ...

  6. jquery 无刷新上传的小function

    function zll_up(click_id,up_url,text_id,show_id){ this.create = function(){} //当点击指定元素时,创建iframe for ...

  7. 学习Numpy基础操作

    # coding:utf-8 import numpy as np from numpy.linalg import * def day1(): ''' ndarray :return: ''' ls ...

  8. IOC功能以及相关的配置

    功能: 控制反转,将对象的创建权反转给Spring可以解决程序耦合性高的问题,大概的意思就是将程序运行时所需要的资源.数据,全部让Spring供给,防止程序与程序之间联系过高,而出现耦合性高的问题. ...

  9. 浅谈struts2的国际化----i18n

    可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization    i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...

  10. 通过select下拉框里的value控制div显示与隐藏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...