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 = 0; i < 5; 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(1000);
            }
            Console.WriteLine("当前线程终止");
            mre.Set();
        }
    }

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

 

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

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

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


image.png


image.png


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864