C#的WaitHandle : 管理多线程状态

有时候,我们创建了多线程,需要知道是否都完成了各自的工作。比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢?

 1     public partial class MainWindow : Window
 2     {
 3         public MainWindow()
 4         {
 5             InitializeComponent();
 6         }
 7
 8         private volatile bool isContinue = false;
 9         static List<WaitHandle> waitHandles = new List<WaitHandle>();
10
11         private void Button_ThreadStart_Click(object sender, RoutedEventArgs e)
12         {
13             if (isContinue)
14                 return;
15
16             isContinue = true;
17
18             Thread t = new Thread(TestWaitAll);//先开启一个线程
19             t.Name = "TestWaitAll";
20             t.Start();
21         }
22
23         private void Button_ThreadStop_Click(object sender, RoutedEventArgs e)
24         {
25             isContinue = false;
26         }
27
28         public void TestWaitAll()
29         {
30             for (int i = 0; i < 5; i++)
31             {           //WaitHandle是一个抽像类别所以得实体化它的子类,也就是 ManualResetEvent 类 或 AutoResetEvent 类
32                 ManualResetEvent wh = new ManualResetEvent(false);
33                 waitHandles.Add(wh);
34                 ThreadPool.QueueUserWorkItem(Task, wh);
35             }
36             WaitHandle.WaitAll(waitHandles.ToArray());
37
38             Console.WriteLine("所有线程都终止!!!!!!");
39             MessageBox.Show("搞定!");
40         }
41
42         public void Task(Object state)
43         {
44             ManualResetEvent mre = (ManualResetEvent)state;
45             while (isContinue)
46             {
47                 Console.WriteLine("{0} : {1}", mre.Handle.ToString(), DateTime.Now.ToLongTimeString());
48                 Thread.Sleep(1000);
49             }
50             Console.WriteLine("当前线程终止");
51             mre.Set();
52         }
53     }

如果不开启线程而是直接在UI线程调用TestWaitAll(),就会有异常

WaitHandle.WaitAll(waitHandles),主线程乖乖等待所有线程完成工作

WaitHandle.WaitAll(waitHandles,2000),设定等待时间,表示主线程愿意等待子线程执行两秒钟

WaitHandle.WaitAny,就是等待任何一线程完成工作

参考:

Thread执行循环的顺序启动WaitHandle.WaitAll方法

C#多线程之二:ManualResetEvent和AutoResetEvent

C#多线程学习 之 线程池[ThreadPool]

C# 多线程的自动管理(线程池)

时间: 2024-08-27 22:27:34

C#的WaitHandle : 管理多线程状态的相关文章

监测和管理Xcache状态

Xcache是一个使用比较多的Opcode缓存器,很多时候,我们为了让脚本的执行效率更加高,可以采取这种缓存器,它可以让脚本引擎不用每次都去编译执行,可以在一次编译后,把Opcode缓存起来,直接去执行,效率会提升30%-40%左右,当PHP文件被更改过以后,Xcache会自动讲该文件的缓存,从Opcode管理器中踢出,执行到该文件时,重新进行缓存,之前写过如何在Centos上部署安装Xcache. 在部署好以后,我们如何进一步去查看它的工作状态,是否为我们提升了效率呢,缓存命中率是多少呢,为它

手把手教你用ngrx管理Angular状态

本文将与你一起探讨如何用不可变数据储存的方式进行Angular应用的状态管理 :ngrx/store--Angular的响应式Redux.本文将会完成一个小型简单的Angular应用,最终代码可以在这里下载. Angular应用中的状态管理 近几年,大型复杂Angular/AngularJS项目的状态管理一直是个让人头疼的问题.在AngularJS(1.x版本)中,状态管理通常由服务,事件,$rootScope混合处理.在Angular中(2+版本),组件通信让状态管理变得清晰一些,但还是有点复

java笔记--关于多线程状态的理解和应用

关于多线程的状态 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3890266.html  "谢谢-- 线程共有6种状态:1.新建线程---使用new来新建一个线程2.运行线程---调用start()方法,线程处于运行或可运行状态3.线程阻塞---线程需要获得内置锁,当该锁被其他线程使用时,此线程处于阻塞状态4.线程等待---当线程等待其他线程通知调度表可以运行时,此时线程处于等待状态5.线程计时等待---当线程调用含有时间参数的

如何在Kubernetes中管理有状态应用

在Kubernetes中,StatefulSet被用来管理有状态应用的API对象.StatefulSets在Kubernetes 1.9版本才稳定.StatefulSet管理Pod部署和扩容,并为这些Pod提供顺序和唯一性的保证.与Deployment相似的地方是,StatefulSet基于spec规格管理Pod:与Deployment不同的地方是,StatefulSet需要维护每一个Pod的唯一身份标识.这些Pod基于同样的spec创建,但互相之间不能替换,每一个Pod都保留自己的持久化标识.

C#中的多线程状态

图1: 线程状态关系图 你可以通过ThreadState属性获取线程的执行状态.图1将ThreadState列举为“层”.ThreadState被设计的很恐怖,它以按位计算的方式组合三种状态“层”,每种状态层的成员它们间都是互斥的,下面是所有的三种状态“层”: 运行 (running) / 阻止 (blocking) / 终止 (aborting) 状态(图1显示)后台 (background) / 前台 (foreground) 状态 (ThreadState.Background)不建议使用

Java 多线程编程之多线程定义和多线程状态

一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() java.lang 类 Thread java.lang.Object java.lang.Thread 所有已实现的接口: Runnable public class Thread  extends Object implements Runnable 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方

iOS开发——多线程OC篇&amp;(五)多线程状态

线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间为基准阻塞4秒 N

第二章 管理程序流(In .net4.5) 之 管理多线程

1. 概述 本章包括同步资源以及取消长时间任务相关的内容. 2. 主要内容 2.1 同步资源 ① lock关键字实现.会阻塞程序,有可能会导致死锁. ② volatile关键字可以禁用编译优化,用于避免优化代码时对多线程的影响. private static volatile int _flag = 0; ③ Interlocked关键字可以原子化一些简单数字运算和比较替换操作. Interlocked.Increment(ref n); // Interlocked.Decrement(ref

java多线程状态转换

http://www.mamicode.com/info-detail-517008.html 相关资料链接 我觉得下面这张图总结的很好