ManualResetEvent知识总结

一、 用法概述

Manual发音:英[ˈmænjuəl]

直译,手动重置事件

开发者的可以手动对线程间的交互进行手动控制.

二、构造函数

构造函数,如果为 true,则将初始状态设置为终止;如果为 false,则将初始状态设置为非终止。

public ManualResetEvent(
	bool initialState //是否为 终止状态
)

如果 ManualResetEvent 的初始状态是终止状态(即,如果其通过为 initialState 传递true 创建),则等待 ManualResetEvent 的线程不阻塞。(亦即WaitOne方法不能阻塞当前线程的执行)

如果初始状态为非终止状态(false),则线程调用 Set() 方法后才不阻塞。

故:通常情况下,我们初始化为false(非终止状态)

三、需要理解和掌握的几个方法

1.WaiOne

阻止当前线程,直到收到信号(当然初始化状态需要为false)

WaitOne有几个重载方法,通过时间进行WaitOne,如果超时就不阻塞了.

其他几个版本:MSDN地址

 

2.Set

将事件状态设置为终止状态,允许一个或多个等待线程继续。

3.ReSet

将事件状态设置为非终止状态,导致线程阻止。

 

四、Demo(网友提供)

using System;
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(11);
			Console.WriteLine("thread: got an event");
			for(int x=0;x < 10;x++)
			{
				Thread.Sleep(1000);
				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();
			}
			while(thrd1.IsAlive)
			{
				Thread.Sleep(1000);
				Console.WriteLine("Main: waiting for thread to stop");
			}
			
			Console.Read();
		}
	}
}

  

五、使用场景

通常出现用于 不同功能的代码且位于不同的线程之中时, 需要进行数据协同.

 

 

 

 

转载于:https://www.cnblogs.com/humble/p/5888526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值