ManualResetEvent用法
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
public static ManualResetEvent mre = new ManualResetEvent(false);
ManualResetEvent建立时是把false作为start的初始状态,这个类用于通知另一个线程,让它等待一个或多个线程。注意,为了通知或监听同一个线程,所有的其它线程都能访问那个类。
等待线程这样写:
mre.WaitOne();
这将引起等待线程无限期的阻塞并等待类来通知。
发信号的线程应该这样:
mre.Set();
这样类就会被通知,值变成true,等待线程就会停止等待。在通知事件发生后,我们就可以使用下面语句把线程置于非终止状态,导致线程阻止:
mre.Reset();
一个测试的例子:
using System.Threading;
namespace ThreadingTester
{
class ThreadClass
{
public static ManualResetEvent mre = new ManualResetEvent(false);
public static void trmain()
{
Thread tr = Thread.CurrentThread;
Console.WriteLine("thread: waiting for an event");
mre.WaitOne();
Console.WriteLine("thread: got an event");
for (int x = 0; x < 10; x++)
{
Thread.Sleep(1000);
mre.WaitOne();
Console.WriteLine(tr.Name + ": " + x);
}
}
static void Main(string[] args)
{
Thread thrd1 = new Thread(new ThreadStart(trmain));
thrd1.Name = "thread1";
thrd1.Start();
for (int x = 0; x < 10; x++)
{
Thread.Sleep(900);
Console.WriteLine("Main:" + x);
if (5 == x) mre.Set();
if (6 == x) mre.Reset();
if (8 == x) mre.Set();
}
while (thrd1.IsAlive)
{
Thread.Sleep(1000);
Console.WriteLine("Main: waiting for thread to stop");
}
}
}
}
运行的结果为:
thread: waiting for an event
Main:0
Main:1
Main:2
Main:3
Main:4
Main:5
thread: got an event
Main:6
Main:7
Main:8
thread1: 0
Main:9
thread1: 1
Main: waiting for thread to stop
thread1: 2
Main: waiting for thread to stop
thread1: 3
Main: waiting for thread to stop
thread1: 4
Main: waiting for thread to stop
thread1: 5
Main: waiting for thread to stop
thread1: 6
Main: waiting for thread to stop
thread1: 7
Main: waiting for thread to stop
thread1: 8
Main: waiting for thread to stop
thread1: 9
Main: waiting for thread to stop
转载于:https://www.cnblogs.com/fengfeng/archive/2008/06/24/1229037.html
ManualResetEvent用法相关推荐
- C#中ManualResetEvent用法简介
简单介绍 多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态.当控制线程调用Set()方法,所有等待线程将恢复并继续执行. ManualResetEvent ...
- C#中ManualResetEvent用法
ManualResetEvent是如何工作的 在内存中保持着一个bool值,如果bool值为False,则使所有线程阻塞,反之,如果bool值为True,则使所有线程退出阻塞.当我们创建ManualR ...
- ManualResetEvent用法详解
转之:http://blog.tom.com/blog/read.php?bloggerid=313638&blogid=13505 Thread and Sync In C# (C#中的线程 ...
- C++/C# Thread多线程总结
1.背景 一直都想写一篇关于多线程的文章,总结一下这方面的知识,也为自己和有需要的人提供参考,不再赘述,开始吧, 现在计算机一般都是多核的,4核和8核的比较多件,用于线上计算或专用工作的计算机更是大概 ...
- C# ManualResetEvent的理解和用法
ManualResetEvent是C#中一个比较常用的工具,可用于线程间通信,实现一种类似信号量的功能(不知道我这样描述是否恰当,有可能不是"类似",而"就是" ...
- C#ManualResetEvent的用法
这是线程之间交互的一个类,这里着重体现了初始化参数的选择. namespace BaseTest {[TestClass]public class ManualResetEventTest{publi ...
- C# Task的用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C#中异步多线程的常见用法
先来看几个基本概念(纯属个人见解,可能不准确): 进程:程序运行时,占用的全部运行资源的总和. 线程:线程是隶属于操作系统管理的,也可以有自己的计算资源,是程序执行流的最小单位.任何的操作都是由线程来 ...
最新文章
- 预言丨AI之后无AI
- J2ME下的游戏精灵的碰撞检测(转)
- 为什么程序员需要关心顺序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence)
- java中匿名数组_Swagger UI:数组中的多个匿名对象
- Windows安装python,以及python的集成开发环境Pycharm
- JEECG 深度使用培训班 周六周日公开课(一期班)
- java switch语句与switch表达式区别及使用
- Linux开机启动过程(13):start_kernel()->setup_arch()完结
- 英文的写作 —— 词汇的积累(环境的描写、写人)
- Alfresco安装与配置图解
- 光立方实现3D贪吃蛇
- aspnetpager 详解 (转)
- 沉船会有什么_泰坦尼克号为何会沉没,百年来又为何一直没有打捞?专家一声叹息...
- 三、Solr管理控制台(二)
- Windows彩色桌面变成灰色,怎么办?
- docker适合初学者吗_简化了Docker:面向绝对初学者的动手指南
- VB全面控制Excel方法大汇总
- 03 - 集合线程安全、锁、Callable、JUC辅助类
- 颜色名称-RGB数值对照表
- ICCV 2019 | 中国研究者无缘最佳论文奖项,接收论文数量超美国,商汤57篇论文入选...