C#的WaitHandle : 管理多线程状态
有时候,我们创建了多线程,需要知道是否都完成了各自的工作。比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private volatile bool isContinue = false;
static List<WaitHandle> waitHandles = new List<WaitHandle>(); private void Button_ThreadStart_Click(object sender, RoutedEventArgs e)
{
if (isContinue)
return; isContinue = true; Thread t = new Thread(TestWaitAll);//先开启一个线程
t.Name = "TestWaitAll";
t.Start();
} private void Button_ThreadStop_Click(object sender, RoutedEventArgs e)
{
isContinue = false;
} public void TestWaitAll()
{
for (int i = ; i < ; i++)
{
//WaitHandle是一个抽像类别所以得实体化它的子类,也就是 ManualResetEvent 类 或 AutoResetEvent 类
ManualResetEvent wh = new ManualResetEvent(false);
waitHandles.Add(wh);
ThreadPool.QueueUserWorkItem(Task, wh);
}
WaitHandle.WaitAll(waitHandles.ToArray()); Console.WriteLine("所有线程都终止!!!!!!");
MessageBox.Show("搞定!");
} public void Task(Object state)
{
ManualResetEvent mre = (ManualResetEvent)state;
while (isContinue)
{
Console.WriteLine("{0} : {1}", mre.Handle.ToString(), DateTime.Now.ToLongTimeString());
Thread.Sleep();
}
Console.WriteLine("当前线程终止");
mre.Set();
}
}
如果不开启线程而是直接在UI线程调用TestWaitAll(),就会有异常

WaitHandle.WaitAll(waitHandles),主线程乖乖等待所有线程完成工作
WaitHandle.WaitAll(waitHandles,2000),设定等待时间,表示主线程愿意等待子线程执行两秒钟
WaitHandle.WaitAny,就是等待任何一线程完成工作
参考:
Thread执行循环的顺序启动WaitHandle.WaitAll方法
C#多线程之二:ManualResetEvent和AutoResetEvent
C#的WaitHandle : 管理多线程状态的更多相关文章
- 管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程
前言 在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值.去年笔者进入了电商领域 ...
- Vue + Element UI 实现权限管理系统 (管理应用状态)
使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题.收缩 ...
- Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态
使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题.收缩 ...
- 手把手教你用ngrx管理Angular状态
本文将与你一起探讨如何用不可变数据储存的方式进行Angular应用的状态管理 :ngrx/store——Angular的响应式Redux.本文将会完成一个小型简单的Angular应用,最终代码可以在这 ...
- 【CPU】进程管理之五状态模型
本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1.进程的五个状态 创建状态 就绪状态 阻塞状态 执行状态 终止状态 2.进程处于这五种状 ...
- 如何利用 React Hooks 管理全局状态
如何利用 React Hooks 管理全局状态 本文写于 2020 年 1 月 6 日 React 社区最火的全局状态管理库必定是 Redux,但是 Redux 本身就是为了大型管理数据而妥协设计的- ...
- OS之进程管理---多线程模型和线程库(POSIX PTread)
多线程简介 线程是CPU使用的基本单元,包括线程ID,程序计数器.寄存器组.各自的堆栈等,在相同线程组中,所有线程共享进程代码段,数据段和其他系统资源. 传统的的单线程模式是每一个进程只能单个控制线程 ...
- Redis客户端管理工具,状态监控工具
TreeNMS是一款Redis web客户端管理工具,采用JAVA开发,实现基于web方式对Redis数据库进行管理.监控.数据维护. 功能包括:数据库的状态监控,库表的展示,key,value的展示 ...
- Vue笔记:使用 vuex 管理应用状态
如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 . 我在使用基于 vue.js 2.0 的UI框架 ElementUI 开发网站的时候 , 就遇到了这种问题 : 一 ...
随机推荐
- 使用powershell来设置时间
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/set-date?view=powers ...
- Android4.4 wpa_supplicant深入分析之wpa_supplicant初始化流程续
下面我们将接上一篇文章继续分析main中第二个关键函数wpa_supplicant_add_iface. wpa_supplicant_add_iface用于向wpa_supplicant添加接口设备 ...
- 电脑升级win10后visio的问题
上周由于电脑意外蓝屏,系统从win7升级到了win10,昨天工作写文档时才发现缺少画图的工具,于是按照了visio2013,在编辑设计图时发现,一旦用visio打开或编辑图后再到word里设计图的内容 ...
- Arranging Your Team
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=35800#problem/D #include <iostream> #inc ...
- JavaScript表格搜索高亮功能模拟
在网页表格中模拟excle的搜索高亮显示功能.当在搜索框中输入需要的姓名时,若表格中存在对应的数据,则该表格背景色变为黄色. 下面为表的HTML源码: <!doctype html> &l ...
- [BZOJ1601] 灌水
难点:找到正确方式建图 知识点:Kruskal 分析:这种题肯定要把点权转换到边权上,但肯定无法搞到和其他点相连的边上,怎么办呢?那就再造一个点呗,这个“超级点”和所有点相连,且边权=点权,于是就可以 ...
- Cracking the Coding Interview 8.5
Implement an algorithm to print all valid combinations of n-pairs of parentheses #include<stdio.h ...
- wpf,vb,位图剪裁的方法
‘ 貌似WPF对GDI+不提供支持,要达到剪裁图像的方法,可以使用image.clip,’不过clip只是对图片的一个遮挡拦截效果,并不改变本身的图片资源.‘下面的代码提供了剪裁图片资源的方法. Di ...
- PHP开发笔记(三)关于PHP伪静态的问题总结
Apache 第一个问题就是关于PHPStudy集成Apache环境下5.5版本以上”No input file specified“问题. 针对TP5框架,以下是.htaccess文件的配置,PHP ...
- Burn Down Chart(2018.5.28~2018.6.3)
任务安排 (2018.6.2 更新——前端总进度) (2018.6.3 更新——后端燃尽图) 娄雨禛[前端部分] 曾子轩[后端部分+燃尽图] 前端 齐天扬+刘鼎乾:设计两组页面,只要求框架和简单的 c ...