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

     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#多线程学习 之 线程池[ThreadPool]

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

最新文章

  1. linux命令-dd {拷贝并替换}
  2. Java连接Oracle数据库开发银行管理系统【三、实现篇】
  3. 深入理解C++虚函数表
  4. (C# Binary Tree) 基本概念和算法
  5. [css] vertical-align和line-height
  6. Spring整合Hessian
  7. &lt;jsp:directive.page&gt;标签
  8. [基础架构]PeopleSoft都有哪些进程运行在进程服务器上
  9. Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
  10. [C++学习历程]Visual Studio 2010 中文旗舰版 安装
  11. java缓存系统
  12. Linux - 延伸正则表达式
  13. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
  14. 我的第一个python web开发框架(33)——接口代码重构
  15. .net中的设计模式---单例模式
  16. python与mysql交互中的各种坑
  17. Log4J2用法
  18. 连续子数组和的最大值plus
  19. EffecJava Method
  20. U盘安装win10

热门文章

  1. HibernateBaseDAO
  2. 2017全面JAVA面试经历总结
  3. Android TextView 设置行间距
  4. fixed和absolute
  5. SQL 琐碎记录
  6. Android入门之文件系统操作(一)简单的文件浏览器
  7. SQL Server 2005数据库定期备份(非常详细)与 SQL Server 2005数据库备份定期清理
  8. Redis(五)-数据库
  9. Ionic学习记录(一):ionic及cordova安装、创建第一个应用、项目结构
  10. 工具分享3:VMware 10虚拟机、MS-DOS 7.1、安装教程(MS-DOS环境安装)