今天我们继续接着线程讲讲,上一章提到一下task概念,

首先接着task继续往下讲,在前章节提到过Thread怎么实现其他线程完成后再让主线程继续执行的功能,那么如果Task也需要线程等待事件,该怎么实现呢?

在这里介绍四种方法。

1、ContinueWhenAny方法

              taskFactory.ContinueWhenAny(taskList.ToArray(), t =>
{
//t.AsyncState
Console.WriteLine("这里是ContinueWhenAny {0}", Thread.CurrentThread.ManagedThreadId);
});

这种做法是在等task对象list集合中的任何一个线程完成后执行回调函数。

2、ContinueWhenAll方法

            taskFactory.ContinueWhenAll(taskList.ToArray(), tList =>
{
Console.WriteLine("这里是ContinueWhenAll {0}", Thread.CurrentThread.ManagedThreadId);
});

这种是等list集合全部完成后在执行,在执行回调函数

3、WaitAny方法

            Task.WaitAny(taskList.ToArray());//执行的线程等待某一个task的完成
Console.WriteLine("after WaitAny{0}", Thread.CurrentThread.ManagedThreadId);

只要等待其中任何一个线程完成,就会继续后面的程序代码。

4、WaitAll方法

            Task.WaitAll(taskList.ToArray());//执行的线程等待全部的task的完成
Console.WriteLine("after WaitAll{0}", Thread.CurrentThread.ManagedThreadId);

 

等待多有线程完成后再去执行后面程序代码。

一般来说有这四种方法,可以解决等待事件的所有需求,如果不能实现,那有可能是程序设计上有些问题了。

***********************************************************************************************************************************************

Parallel:这个是.net后面提出的概念

Parallel.Invoke(() => this.TestThread("btnParallel_Click_0")
, () => this.TestThread("btnParallel_Click_1")
, () => this.TestThread("btnParallel_Click_2")
, () => this.TestThread("btnParallel_Click_3")
, () => this.TestThread("btnParallel_Click_4")); //等于使用4个task,然后主线程同步invoke一个委托 然后主线程waitall

  

这种做法就是让主线程也参与在计算中,充分利用资源吧。

            Parallel.For(6, 10, t =>
{
string name = string.Format("For btnParallel_Click_{0}", t);
this.TestThread(name);
}); Parallel.ForEach(new int[] { 5, 6, 7, 10, 8473847 }, t =>
{
string name = string.Format("ForEach btnParallel_Click_{0}", t);
this.TestThread(name);
}); ParallelOptions parallelOptions = new ParallelOptions()
{
MaxDegreeOfParallelism = 5//相当于设置一个最大的线程数
};
Parallel.For(6, 15, (t, state) =>
{
string name = string.Format("btnParallel_Click_{0}", t);
this.TestThread(name);
Console.WriteLine(state);
state.Break();//退出单次循环
state.Stop();//退出全部的循环
return;
});

  

Thread(线程)三的更多相关文章

  1. java 并发(三)---Thread 线程

    Thread 的状态 线程共有五种状态.分别是: (1)新建 (2)就绪 (3)运行 (4)阻塞 (5)死亡 ,下面列列举的状态需要结合状态示意图更好理解.  新建状态(New): 新创建了一个线程对 ...

  2. C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)

    C#中的线程三(结合ProgressBar学习Control.BeginInvoke) 本篇继上篇转载的关于Control.BeginInvoke的论述之后,再结合一个实例来说明Cotrol.Begi ...

  3. 学习接水系统(java+thread线程)

    (一)项目框架分析 对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头. 接下来主要讲解不排队接水和排队接水两张情况. 项目的目录文件如下: (二)不排队接水 假设有四个学生小 ...

  4. QT5 Thread线程

    QT5 Thread线程继承QThread方式 一.首先分析一下 QTimer Class与 Sleep()函数之间的秘密 QTimer *t = new QTimer(*parent); //创建Q ...

  5. java线程——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  6. std::thread线程库详解(2)

    目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...

  7. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  8. c++11中关于`std::thread`线程传参的思考

    关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...

  9. Thread 线程池

    Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...

  10. Thread线程的基础知识及常见疑惑点

    引言 相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更 ...

随机推荐

  1. HDU2157 How many ways矩阵再识

    春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室 ...

  2. BestCoder Round #1 第二题 项目管理

    // 第二题 我记得很久很久很久以前看过这样的题目,忘记是哪的区域赛了 // 记得有人说和节点度数有关,我记不清了,反正当时完全不懂 // 然后我想了想,估计就是更新节点度数有关,YY出来可能只要更新 ...

  3. 搭建jetbrains 注册服务器

    wget http://home.ustc.edu.cn/~mmmwhy/jetbrain.sh && sh ./jetbrain.sh 输入默认的端口号跟用户名,然后记住服务器地址. ...

  4. LeetCode Number of Atoms

    原题链接在这里:https://leetcode.com/problems/number-of-atoms/description/ 题目: Given a chemical formula (giv ...

  5. (转)Android studio 使用心得(五)—代码混淆和破解apk

    这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...

  6. C# WinForm页面切换导致闪烁的解决方法(转)

    问题描述 界面上放置大量的控件(尤其是自定义控件)会导致在窗体加载时,速度变得缓慢:当切换页面时,也会时常产生闪烁的问题,非常影响用户体验. 解决方法 将此代码写在要解决闪烁问题的父窗体中: prot ...

  7. RK3288 手动设置电池电量

    参考:[RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100% 系统版本:RK3288 android 5.1 (与参考的变量和宏有点区别) 设备没有电池,在进行Fota升 ...

  8. 生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

    全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; st ...

  9. 将xml转为array

    /** * 将xml转为array * @param string $xml * @throws Exception */ public function FromXml($xml) { if (!$ ...

  10. Java将对象写入文件读出——序列化与反序列化

    Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的. 写入: File aFile=new File("e:\\c.txt&q ...