标签:Console WriteLine Thread c# ManualResetEventSlim mainEvent Thead
前言
后续会把异步编程的ManualResetEventSlim 深入写完,先简单介绍一下吧。
ManualResetEventSlim 有set 方法和 reset 、wait、dispose方法。
ManualResetEventSlim wait 方法 阻止当前线程,直到设置了当前 ManualResetEventSlim 为止。
看上图,一个ManualResetEventSlim 可以去给多个线程增加锁。
他的set 和 reset 就是控制锁的打开和关闭。
这样解释可能不太理解哈,看下代码。
正文
代码:
static ManualResetEventSlim _mainEvent = new ManualResetEventSlim();
static void Main(string[] args)
{
var t1 = new Thread(() => TravelThrougnGates("Thead 1", 5));
var t2 = new Thread(() => TravelThrougnGates("Thead 2", 6));
var t3 = new Thread(() => TravelThrougnGates("Thead 3", 12));
t1.Start();
t2.Start();
t3.Start();
Thread.Sleep(TimeSpan.FromSeconds(6));
_mainEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(2));
_mainEvent.Reset();
Console.WriteLine($"_mainEvent is not open");
Thread.Sleep(TimeSpan.FromSeconds(10));
Console.WriteLine($"_mainEvent is open");
_mainEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine($"_main enter");
}
static void TravelThrougnGates(string Threadname, int second)
{
Console.WriteLine($"{Threadname} start sleep");
Thread.Sleep(TimeSpan.FromSeconds(second));
Console.WriteLine($"{Threadname} start running");
_mainEvent.Wait();
Console.WriteLine($"{Threadname} enter gate");
}
运行一下,断点位置为:第一个:_mainEvent.Set();
看下结果:
也就是说6秒了,但是Thead 1 和 Thead 2 依然没有执行完毕,说明线程被阻塞了。
然后断点为:_mainEvent.Reset(); 阻塞了:Thead 3。
执行完毕了Thead 1 和 Thead 2
然后_mainEvent.Reset();又关闭了,然后阻塞了。
后续
补齐原理。
标签:Console,WriteLine,Thread,c#,ManualResetEventSlim,mainEvent,Thead 来源: https://www.cnblogs.com/aoximin/p/13219950.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。