ManualResetEven使用的最清楚说明
ManualResetEven使用的最清楚说明
快速阅读
理解ManualResetEvent,以及如何使用。
官方说明
官方介绍:https://docs.microsoft.com/en-us/dotnet/api/system.threading.manualresetevent?view=netframework-1.1
一个线程同步事件 ,通过发信号来控制线程来控制 是否有权限访问 资源
构造函数
初始化实例,并且指明信号的初始状态 。
private static ManualResetEvent mre = new ManualResetEvent(false);
true:表示线程可以访问资源 ,就是可以无视waitone里的等待
false:表示线程如果碰到waitone的时候 ,就要暂停,等主线程来控制 。
比如如下demo中,主线程调用线程执行以下方法时,如果默认是false,则只会输入***starts and calls mre.WaitOne() 而没有 ___ends的输出,因为默认是false ,线程中的waitone()会阻止线程的继续访问 。
private static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine(name + " starts and calls mre.WaitOne()");
mre.WaitOne();
Console.WriteLine(name + " ends.");
}
Set()方法
将事件状态设置为“已发送信号”,允许被waitone() 阻止的一个或者多个线程进行执行线程中的代码。
这个上面的demo中就会在调用mre.set()方法执行之后,会继续调用线程中的下面的___ends 的输出。
Reset()方法
将事件状态设置为“没信号”,这样线程中执行waitone()的时候 ,就会阴止当前线程的执行。实现了和构造函数传入默认值false一样的效果,不过它可以在执行的过程中,进行重新设置,表求又把线程调用组止了。
直接再次接收到set方法 。才会再次执行下面的访问 。
官方的demo
private static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");
for (int i = 0; i <= 2; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
"\nto release all the threads.\n");
Console.ReadLine();
mre.Set();
Thread.Sleep(500);
Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
"\ndo not block. Press Enter to show this.\n");
Console.ReadLine();
for (int i = 3; i <= 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
"\nwhen they call WaitOne().\n");
Console.ReadLine();
mre.Reset();
// Start a thread that waits on the ManualResetEvent.
Thread t5 = new Thread(ThreadProc);
t5.Name = "Thread_5";
t5.Start();
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
Console.ReadLine();
mre.Set();
}
private static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine(name + " starts and calls mre.WaitOne()");
mre.WaitOne();
Console.WriteLine(name + " ends.");
}
运行结果

友情提示
我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题。可以直接在公众号《爱码农爱生活 》留言。必定会再次复查原因。让每一篇 文章的流程都能顺利实现。

ManualResetEven使用的最清楚说明的更多相关文章
- C#学习笔记之线程 - 通知Signal
通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...
随机推荐
- DCL 管理权限
一个数据库里面有着多个用户,每个用户的权限也不仅相同. 一.查询权限 1.基本语法格式: show grants for '用户名'@'主机名'; 2.具体操作 查看 user1 用户的权限 注意: ...
- iview carousel 图片不显示;iview 轮播图 图片无法显示(转载)
转载来源:https://segmentfault.com/q/1010000016778108 相关代码 <Carousel autoplay v-model="value2&quo ...
- 一个关于integer表示范围的问题
1:在做字符串parse为integer 类型市,一直出现问题就是当我parse “”2851663837”报错, 但是当我parse “1417585794” 可以.原来是超出integer 类型 ...
- 学习python的日常6
错误.调试和测试: 错误处理: try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivisionError as e: p ...
- table标签修改tr,td标签的行距
修改tr标签的行距,tbale标签的td标签间距 看如下Css文件的代码,其都没有table的tr行距产生效果 tr{ margin-top: 10px; padding: 10px; } td{ m ...
- ISCC之msc5他们能在一起吗?
如题,开始分析,附件是一个二维码,读出来一串base64 拿去解密,PASS{0K_I_L0V3_Y0u!} 提交几次不对, 继续hxd分析图片,最后在文件末尾发现一个txt 修改后缀,是加密的, 拿 ...
- mysql字典取值,列表包含
SELECT * FROM e where JSON_CONTAINS(json_extract(scope_detail, '$.shop'), '001');
- 传入json字符串的post请求
/** * 传入json字符串的post请求 * @Title: getRequsetData * @Description: TODO * @param @param url * @param @p ...
- idea 模板
/** * @author sharplee * @version 1.0.0 * @ClassName ${PACKAGE_NAME}.${NAME} * @Description * @creat ...
- PS批量截取图片
本文提供的是需要截取大量图片的方法,仅供参考. 打开ps,在菜单栏找到窗口,点击窗口里面的动作 窗口右上方 或者下方会出现一个小窗口 点击小窗口右下角删除图标旁边的图标新建动作,工作名称:截取图片 . ...