ManualResetEvent详解
来源:互联网 发布:淘宝开店怎么做代销 编辑:程序博客网 时间:2024/06/06 19:53
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
//ManualResetEvent的整体思路是在相关线程外部通过//手动设置ManualResetEvent.Set()和ReSet()来决定相关线程是否运行using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ManualResetEventDemo{ class MREDemo { private ManualResetEvent _mre; public MREDemo() { this._mre = new ManualResetEvent(true); } public void CreateThreads()//创建两个线程都是调用同一个函数 { Thread t1 = new Thread(new ThreadStart(Run)); t1.Start(); Thread t2 = new Thread(new ThreadStart(Run)); t2.Start(); } public void Set() { this._mre.Set();//将事件状态设置为终止状态,允许一个或多个等待线程继续 } public void Reset() { this._mre.Reset();//将事件设置为非终止状态导致线程阻止 } private void Run() { string strThreadID = string.Empty; try { while (true) { // 阻塞当前线程 this._mre.WaitOne(); strThreadID = Thread.CurrentThread.ManagedThreadId.ToString(); Console.WriteLine("Thread(" + strThreadID + ") is running..."); Thread.Sleep(5000); } } catch (Exception ex) { Console.WriteLine("线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString()); } } } class Program { static void Main(string[] args) { Console.WriteLine("****************************"); Console.WriteLine("输入\"stop\"停止线程运行..."); Console.WriteLine("输入\"run\"开启线程运行..."); Console.WriteLine("****************************\r\n"); MREDemo objMRE = new MREDemo(); objMRE.CreateThreads(); while (true) { string input = Console.ReadLine(); if (input.Trim().ToLower() == "stop") { Console.WriteLine("线程已停止运行..."); objMRE.Reset(); } else if (input.Trim().ToLower() == "run") { Console.WriteLine("线程开启运行..."); objMRE.Set(); } } } }}
0 0
- ManualResetEvent详解
- ManualResetEvent详解
- ManualResetEvent详解
- ManualResetEvent详解
- ManualResetEvent详解
- 详解 ManualResetEvent
- AutoResetEvent和ManualResetEvent详解
- socket编程《四》ManualResetEvent详解
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- NET多线程同步方法详解(六):事件(ManualResetEvent/AutoResetEvent)
- NET多线程同步方法详解(六):事件(ManualResetEvent/AutoResetEvent)
- ManualResetEvent用法
- ManualResetEvent用法
- Linux书籍
- 133
- Linux常见函数的区别
- Machine Learning in Action | ApacheCN(apache中文网)
- Groovy学习
- ManualResetEvent详解
- TIME_WAIT
- Http协议讲解
- 硬件加速不支持的问题
- 基础Mybatis操作数据库(MySql)(一)
- 【WebAPI】将硬件GPS转换为高德GPS(WGS-84转GCJ-02)
- 二级导航
- QT鼠标左键按下,鼠标样式改变,释放之后,鼠标样式还原
- 使用jqPaginator.js分页中文显示乱码