源码下载:

下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar

Demo:

2. ManualResetEvent详解

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

view source print?
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());
            }
        }
  
    }
}

view source print?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
namespace ManualResetEventDemo
{
    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();
                }
            }
              
        }
    }
}

ManualResetEvent详解相关推荐

  1. Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园

    Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园 Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpkin ...

  2. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  3. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  4. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  5. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  6. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  7. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  8. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  9. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

最新文章

  1. 2016-2017 ACM-ICPC CHINA-Final(EC-final) 题解(10 / 12)
  2. 吴恩达推荐笔记:22 张图总结深度学习全部知识
  3. 揭秘全球首次互联网8K直播背后的技术实现
  4. 昆仑通态复制的程序可以用吗_昆仑通态专题(七):MCGS组态软件的设备窗口...
  5. 弱小无助!苹果或将出手救援屏幕供应商JDI
  6. python多线程下载多个文件_python多线程下载文件 练习1
  7. 关于线段树套伸展树被卡常
  8. windows上vscode 安装Fortran-language-server
  9. SPI操作flash MX25L64读写数据
  10. c4dr20怎么安装oc渲染器怎么安装_c4d怎么安装oc渲染器/插件
  11. 三点估算法_三点估算法公式是怎么得来的
  12. 微微一笑很倾城(2)
  13. 三代Pacbio进行细菌16S全长测序
  14. 微信小程序wx.downloadFile下载图片(甄姬)出现格式.unknown的bug
  15. 【操作系统】成组链接法详解
  16. 利用XAG在RAC环境下实现GoldenGate自动Failover
  17. 快消品行业S2B2C电子商务网站提升供应链效率,加速行业整合
  18. “最不合格”的SAP应聘者: 从大学生到SAP成都研究院开发工程师
  19. Kth Excluded
  20. Windows下Git使用记录--03 Git GUI与金山快盘组建私人代码仓库进行项目开发

热门文章

  1. 信息学奥赛一本通(1183:病人排队)
  2. windy数(BZOJ-1026)
  3. 信息学奥赛C++语言: 素数个数
  4. 17 PP配置-生产计划-总体维护工厂参数
  5. c++初学者如何学好基础?
  6. 怎么查linux上谁删了文件,如何在 Linux 下快速找到被删除的文件?
  7. php默认语法,php语法基本规则
  8. MySQL useSSS_Mysql 常用操作记录
  9. 英语四六级听力考试选项技巧
  10. rem,em,px的区别