明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1275, 文章 - 0, 评论 - 214, 阅读 - 320万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

多线程调度例子·····················

Posted on   且行且思  阅读(1995)  评论(0编辑  收藏  举报

  private ManualResetEvent _isServerClosed = new ManualResetEvent(false);

        private void StartThreads()
        {
            //生成ABCD四个线程
            for (int i = 0; i < 4; i++)  //
            {
                System.Threading.Thread t = new Thread(new ThreadStart(ReceiveData));
                t.Start();
            }
        }

        //停止接收,运行在主线程上.      
        private void button6_Click(object sender, EventArgs e)
        {
            _isServerClosed.Set();
        }

        //运行在新生成的线程上
        private void ReceiveData()
        {
            //等待100毫秒,接受数据,
            while (!_isServerClosed.WaitOne(100, false))
            {
                //接收数据......

                for (int i = 0; i < 1000000; i++)
                {
                  

                    ////this.richTextBox1.Text += i.ToString() + "\r\n";
                    //System.Diagnostics.Process.Start("CMD.exe", i.ToString() + "\r\n");

                }
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
            button1.Enabled = false;
            Mutex1 = new Mutex(true);//Mutex对象(一个调度指令)
            Mutex2 = new Mutex(true);
            Mutex3 = new Mutex(true);
            Mutex4 = new Mutex(true);
            Mutex5 = new Mutex(true);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "多线程调度例子");//主线程暂停时,更新进度信息
            Thread T1 = new Thread(new ThreadStart(Thread1));//定义4个线程
            Thread T2 = new Thread(new ThreadStart(Thread2));
            Thread T3 = new Thread(new ThreadStart(Thread3));
            Thread T4 = new Thread(new ThreadStart(Thread4));
            T1.Start();// 使用Mutex.WaitAll()方法等待一个Mutex数组(Mutex4和Mutex5)中的对象全部被释放
            T2.Start();// 使用Mutex.WaitOne()方法等待Mutex3的释放
            T3.Start();// 使用Mutex.WaitAny()方法等待一个Mutex数组中任意一个对象被释放
            T4.Start();// 使用WaitHandle.WaitAll等待所有线程结束
            Thread.Sleep(10);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "分五个线程调度指令Mutex1--Mutex5");//主线程暂停时,更新进度信息
            Thread.Sleep(2000);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex1");//主线程暂停时,更新进度信息
            Mutex1.ReleaseMutex(); //线程Thread3结束条件满足
            Thread.Sleep(2000);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex3");//主线程暂停时,更新进度信息
            Mutex3.ReleaseMutex(); //线程Thread2结束条件满足
            Thread.Sleep(2000);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex4");//主线程暂停时,更新进度信息
            Mutex4.ReleaseMutex();
            Thread.Sleep(2000);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex5");//主线程暂停时,更新进度信息
            Mutex5.ReleaseMutex(); //线程Mutex1结束条件满足
            button1.Enabled = true;
        }

        private static Mutex Mutex1, Mutex2, Mutex3, Mutex4,Mutex5;//创建Mutex对象(调度指令)
        private static AutoResetEvent Event1 = new AutoResetEvent(false);//线程结束信息灯,未结束false,结束true
        private static AutoResetEvent Event2 = new AutoResetEvent(false);
        private static AutoResetEvent Event3 = new AutoResetEvent(false);
        private AutoResetEvent[] EventS = new AutoResetEvent[] { Event1, Event2, Event3 };//线程组结束信息灯

        private delegate void ChangeString(string Txt);//这个代理能异步调用设置文本框(可以多参数)

        public void Thread1()
        {
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), new object[] { "线程Thread1启动,Mutex.WaitAll,等待Mutex4和Mutex5都释放信号" });//从VS2005开始,给主线程控件附值被认为是不安全的
            Mutex[] gMs = new Mutex[2];
            gMs[0] = Mutex4;//创建一个Mutex数组作为Mutex.WaitAll()方法的参数
            gMs[1] = Mutex5;
            Mutex.WaitAll(gMs);//等待Mutex1和Mutex2都被释放
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread1结束");//从VS2005开始,给主线程控件附值被认为是不安全的
            Event1.Set(); //线程结束,将Event1设置为有信号状态
        }

        public void Thread2()
        {
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread2启动,Mutex3.WaitOne,等待Mutex3释放信号");//从VS2005开始,给主线程控件附值被认为是不安全的
            Mutex3.WaitOne();//等待Mutex3被释放
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread2结束");//从VS2005开始,给主线程控件附值被认为是不安全的
            Event2.Set();//线程结束,将Event2设置为有信号状态
        }

        public void Thread3()
        {
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread3启动,Mutex.WaitAny,等待Mutex1和Mutex2中的一个释放信号");//从VS2005开始,给主线程控件附值被认为是不安全的
            Mutex[] gMs = new Mutex[2];
            gMs[0] = Mutex1;//创建一个Mutex数组作为Mutex.WaitAny()方法的参数
            gMs[1] = Mutex2;
            Mutex.WaitAny(gMs);//等待数组中任意一个Mutex对象被释放
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread3结束");//从VS2005开始,给主线程控件附值被认为是不安全的
            Event3.Set();//线程结束,将Event3设置为有信号状态
        }
        public void Thread4()
        {
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread4启动,WaitHandle.WaitAll,等待所有线程结束");//从VS2005开始,给主线程控件附值被认为是不安全的
            WaitHandle.WaitAll(EventS);
            richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread4结束,所有线程结束");//从VS2005开始,给主线程控件附值被认为是不安全的
        }
        private void SetrichTextBox1Text(string Txt)//此部分实际上是主线程调用的(可以多参数)
        {
            richTextBox1.Text += Txt + "\r\n";
            richTextBox1.Refresh();
        }

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示