少有人走的路

勇哥的工业自动化技术网站

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


发表评论:

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

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864