您现在的位置是:首页 >其他 >C# ManualResetEvent和AutoResetEvent的作用网站首页其他
C# ManualResetEvent和AutoResetEvent的作用
ManualResetEvent和AutoResetEvent的作用
是用来控制线程暂停或者继续的,常用的方法有WaitOne,set,Reset.
这三个函数的含义:
去旅游景点排队检票
waitone:等下个过来检票
set:身份核验通过,你买的是今天的票,开启闸门
reset:关闭闸门
AutoResetEvent autoWaitsupport = new AutoResetEvent(false);//闸门默认关闭
AutoResetEvent autoWaitsupport = new AutoResetEvent(true);//闸门默认开启
ManualResetEvent manueWaitsupport = new ManualResetEvent(false);//闸门默认关闭
ManualResetEvent manueWaitsupport = new ManualResetEvent(false);//闸门默认开启
ManualResetEvent和AutoResetEvent的区别
AutoResetEvent:是自动的,每次通过后,自动关闭,即上一个游客通过后,闸门自动关闭,下一个游客需要再检票通过,
ManualResetEvent:是手动的,每次通过后,手动关闭,即上一个游客通过后,闸门没有手动关闭,这闸门一直开着,剩下的游客不需要检票也可通过
即:
AutoResetEvent 收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne .
ManualResetEvent 收到 Set 后,所有处理 WaitOne 状态线程均继续执行.ManualResetEvent更加自由、开放。如果把AutoResetEvent看作是只能单人通过的独木桥的话,那么ManualResetEvent就像一座城门,一下子可以涌入千军万马,当然你也可以随时关闭城门,让后面的人进不来。
如果共享资源仅允许一个线程单独使用的情况下,可以选择AutoResetEvent;如果共享资源允许多个线程同时使用,则可以选择ManualResetEvent。
如果要控制多个线程暂停、继续,可以选择ManualResetEvent。
测试代码如下:
public class StudyResetEvent
{
public AutoResetEvent mreWaitsupport = new AutoResetEvent(true);//阀门开启
public void Car1()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道1进一个游客!");
}
public void Car2()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道2进一个游客!");
}
}
StudyResetEvent a=new StudyResetEvent();
new Thread(a.Car1).Start();
new Thread(a.Car2).Start();
a.mreWaitsupport.Set();//开启车闸
Console.ReadKey();
输出结果:噫!通道1进一个游客!
想要输出两个结果的话:
public class StudyResetEvent
{
public AutoResetEvent mreWaitsupport = new AutoResetEvent(true);//阀门开启
public void Car1()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道1进一个游客!");
mreWaitsupport.set();
}
public void Car2()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道2进一个游客!");
}
}
输出结果:
噫!通道1进一个游客!
噫!通道2进一个游客!
也就是每调用一次Set,仅有一个线程会继续。换言之,有多少个线程就要调用多少次Set,线程才会全部继续。
这也表明,AutoResetEvent是典型的队列操作形式。
public class StudyResetEvent
{
public ManualResetEvent mreWaitsupport = new ManualResetEvent(true);//阀门开启
public void Car1()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道1进一个游客!");
}
public void Car2()
{
mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
Console.WriteLine("噫!通道2进一个游客!");
}
}
StudyResetEvent a=new StudyResetEvent();
new Thread(a.Car1).Start();
new Thread(a.Car2).Start();
a.mreWaitsupport.Set();//开启车闸
Console.ReadKey();
输出结果:
噫!通道1进一个游客!
噫!通道2进一个游客!