最近工作中需要用到数据同步的功能,在阅读公司源码的过程中遇到了ManualResetEventSlim这个玩意的使用,看到有点懵圈,后来查了一下资料以后,写了个小DEMO出来,帮助大家理解一下用法,大家可以创建一个控制台应用跑一下就行了
static void Main(string[] args)
{
ManualResetEventSlim _mainEvent1 = new ManualResetEventSlim(true);
ManualResetEventSlim _mainEvent2 = new ManualResetEventSlim(true);
Task.Run(() =>
{
DoSome("毛熊", _mainEvent1);
});
Task.Run(() =>
{
DoSome("鹰酱", _mainEvent2);
});
while (true) {
var aa = Console.ReadKey().KeyChar.ToString();
Console.WriteLine(" \r\n");
if (aa == "1")
{
_mainEvent1.Set();
Console.WriteLine(" \r\n");
Console.WriteLine("毛熊可以说话了,按2禁言它");
_mainEvent1.Set();
}
else if (aa == "2")
{
_mainEvent1.Reset();
Console.WriteLine(" \r\n");
Console.WriteLine("毛熊被禁言了,按1可以恢复");
}
else if (aa == "3")
{
_mainEvent2.Set();
Console.WriteLine(" \r\n");
Console.WriteLine("鹰酱可以说话了,按4禁言鹰酱");
}
else if (aa == "4")
{
_mainEvent2.Reset();
Console.WriteLine(" \r\n");
Console.WriteLine("鹰酱被禁言了,按3可以恢复");
}
else {
Console.WriteLine($"兔子:你乱按是木用的啦");
}
}
}
public static void DoSome(string tname, ManualResetEventSlim ms)
{
while (true) {
Thread.Sleep(TimeSpan.FromSeconds(3));
ms.Wait();
Console.WriteLine($"my name is {tname}, i am running");
}
}
从上面的例子可以看出来,ManualResetEventSlim就像是一个开关一样,可以利用它的Set()和Reset()来控制线程的运行