当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

C#的WaitHandle : 管理多线程状态

Jorge2年前 (2022-05-09)C#/.net框架700

 

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

C#
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


#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。

扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=81

标签: .NET.NET框架
分享给朋友:

“C#的WaitHandle : 管理多线程状态” 的相关文章

C# 控件闪烁问题的解决

C# 控件闪烁问题的解决

说一下解决C#下控件闪烁的几个问题,如下:  listview和datagridview显示数据闪烁 自定义控件的显示闪烁listbox滚动条拖动闪烁面板中控件过多的闪烁propertyGrid点击和修改项目缓慢的问题richtextbox控件的刷新显示问题此类问题对于界面复杂规...

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件是很强。可以实现类似Vitual Studio属性面板那样的效果。但是。。。。我们一直痛苦它在选择和修改项目的时候很慢。我的用法是使用控件的SelectObject来绑定数据。C# PgridMotionSpeed.SelectedObject ...

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

C# 当前不会命中断点 还没有为该文档加载任何符号

C# 当前不会命中断点 还没有为该文档加载任何符号

这个问题网上的经验大概如下:1。 清空方案,重新编译2。 删除项目bin目录下的东西,重新编译3。 解决相互引用的问题。4。 确保不是run的release5。把项目编译改为x866。 好像没发现其它的了。。。这些解决不了我们手上的项目的问题。我们的工程有几十个项目。我长话短说,解决方法是:引导项目...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

发表评论

访客

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