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# 多线程的自动管理(线程池)

转载于:https://www.cnblogs.com/AlvinLiang/p/4522319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值