C#中ManualResetEvent用法详解
第一、简单介绍 ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。 当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态, 如果初始状态处于终止状态,为 true;否则为 false。 第二、代码演示 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication2 { class MyThread { Thread t = null; ManualResetEvent manualEvent = new ManualResetEvent(true);//为trur,一开始就可以执行 private void Run() { while (true) { this.manualEvent.WaitOne(); Console.WriteLine("线程id:{0}",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); } } public void Start() { this.manualEvent.Set(); } public void Stop() { this.manualEvent.Reset(); } public MyThread() { t = new Thread(this.Run); t.Start(); } } class Program { static void Main(string[] args) { MyThread myt = new MyThread(); while (true) { Console.WriteLine("输入 stop 后台线程挂起 start 开始执行!"); string str = Console.ReadLine(); if (str.ToLower().Trim() == "stop") { Console.WriteLine("线程停止运行...n"); myt.Stop(); } if (str.ToLower().Trim() == "start") { Console.WriteLine("线程开启运行...n"); myt.Start(); } } } } } 运行测试结果 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – 为什么我不能使用此构造函数参数构造此用户定义类型的
- jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
- cocos2dx3.3开发FlappyBird总结十七:结束语
- C – 关于包含“类型”成员的联合的问题
- c# – 如何为没有问号的控制台窗口格式化md5.ComputeHash
- ruby-on-rails – 创建日历/计划程序应用程序 – Ruby on R
- 云端驱动,成效卓越!-2017 Oracle亚太区用户组领导人峰会
- 架构师之oracle------------父子序列递归查询
- React:ES6:ES7中的6种this绑定方法
- XML-RPC – 在Java中从服务器到客户端抛出异常