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(1000);
                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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 这里是factory  上面两个线程也要start
            Task.Factory.ContinueWhenAll(new Task[2] { 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(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 这里是factory  上面两个线程也要start
            Task.Factory.ContinueWhenAny(new Task[2] { t1, t2 }, t =>
            {
                Console.WriteLine("factory 中的when Any");
            });
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }

    }
}

我是主线程
我是wait2
factory 中的when Any
我是wait1

原文地址:https://www.cnblogs.com/wholeworld/p/10193385.html

时间: 2024-11-10 01:21:44

2 Task中的延续和7种阻塞的相关文章

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

建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上. 在任务并行库中,如果对任务运行Wait.WaitAny.WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常.可以将AggregateException异常看做是任务并行库编程中最上层的异

Photoshop中磁力套索的一种简陋实现(Python)

经常用Photoshop的人应该熟悉磁力套索(Magnetic Lasso)这个功能,就是人为引导下的抠图辅助工具.在研发领域一般不这么叫,通常管这种边缘提取的办法叫Intelligent Scissors或者Livewire. 本来是给一个图像分割项目算法评估时的Python框架,觉得有点意思,就稍稍拓展了一下,用PyQt加了个壳,在非常简陋的程度上模拟了一下的磁力套索功能.为什么简陋:1) 只实现了最基本的边缘查找.路径冷却,动态训练,鼠标位置修正都没有,更别提曲线闭合,抠图,Alpha M

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

在说Asnc和Await之前,先说明一下Func和Action委托, Task任务的基础的用法 1. Func Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. Action<T>和Func<T,TResult>的功能是一样的,只是Action<T>没有返类型, Func<T,T,Result>:有参数,有返

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

开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL Task 的场景包含但不止于以下几类: 在从源端加载数据到 Staging 表之前使用 Execute SQL Task 执行一些 Truncate 操作. 执行一些 Log 的插入,更新操作. ETL 过程中的 Merge 语句操作. XML 的输出处理. 关于如何使用 Execute SQL

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

0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开启一个线程,在线程中运行一个while循环接收数据,接收到数据就处理.用户退出(收到QUIT命令)后线程结束.程序一直运行正常(当然还要处理“TCP粘包”.消息格式封装等问题,在此不作讨论),不过随着使用的人越来越多,而且考虑到线程开销比较大,如果有100个用户链接那么服务端就要多创建100个线程,500个用户就是500个线程,确实太

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

Linux中生成密钥的两种方法

Linux中生成密钥的两种方法 SSH服务支持一种安全认证机制,即密钥认证.所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密:另一个称为密钥(privatekey),只有拥有者才能看到,用于解密.通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难. ssh的密钥认证就是使用了这一特性.服务器和客户端都各自拥有自己的公钥和密钥.如何使用密钥认证登录linux服务器呢? 在使用密钥认证远程登入linux之前,我们

JAVA中集合输出的四种方式

在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public static void main(String[] args) throws Exception { Set<Person> javaProgramers = new HashSet<Person>(); javaProgramers.add(new Person("aaron&qu

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys