C#的WaitHandle : 管理多线程状态
2024-09-28 16:04:05
有时候,我们创建了多线程,需要知道是否都完成了各自的工作。比如说,开启了多线程的下载,如何终止所有的线程并且在确保所有线程都终止之后才继续执行程序的退出呢?
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
最新文章
- linux命令-dd {拷贝并替换}
- Java连接Oracle数据库开发银行管理系统【三、实现篇】
- 深入理解C++虚函数表
- (C# Binary Tree) 基本概念和算法
- [css] vertical-align和line-height
- Spring整合Hessian
- <;jsp:directive.page>;标签
- [基础架构]PeopleSoft都有哪些进程运行在进程服务器上
- Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
- [C++学习历程]Visual Studio 2010 中文旗舰版 安装
- java缓存系统
- Linux - 延伸正则表达式
- [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
- 我的第一个python web开发框架(33)——接口代码重构
- .net中的设计模式---单例模式
- python与mysql交互中的各种坑
- Log4J2用法
- 连续子数组和的最大值plus
- EffecJava Method
- U盘安装win10