前言
后續會把異步編程的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();又關閉了,然后阻塞了。
后續
補齊原理。