本文主要介绍C # ManualReseteEvent的用法详解,通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值。有需要的朋友下面跟边肖学习。
ManualResetEvent表示线程同步事件,可以统一管理所有等待的线程(收到信号时必须手动复位事件)。
它的构造函数是:
public manual reset event(bool initial state);
参数initialState指示是否初始化;如果为真,则初始状态设置为终止(非阻塞);如果为false,则初始状态设置为非终止(阻塞)。
注意:如果其参数设置为true,ManualResetEvent等待的线程将不会阻塞。如果初始状态为false,线程将被阻塞,直到Set调用方法。
它只有两条路。
//将事件状态设置为终止状态,从而允许一个或多个等待线程继续执行。
公共布尔集();
//将事件状态设置为非终止,这将导致线程被阻塞。
公共bool Reset();
//返回值:操作成功返回真,否则返回假
说到这里,我们举个例子来了解一下。
使用系统;
使用系统。穿线;
公共类示例
{
//mre用于手动阻塞和释放线程。它是
//在无信号状态下创建。
private static ManualResetEvent MRE=new ManualResetEvent(false);
静态空干管()
{
控制台。WriteLine(' \ n启动在ManualResetEvent上阻塞的3个命名线程:\ n ');
for(int I=0;I=2;我)
{
Thread t=新线程(Thread proc);
t.name=' Thread _ ' I;
t.start();//启动线程
}
线程。睡眠(500);
控制台。WriteLine(' \ n当所有三个线程都启动后,按Enter调用Set()'
\ n释放所有线程。\ n’);
控制台。ReadLine();
mre。set();
线程。睡眠(500);
控制台。WriteLine(' \ n当发出ManualResetEvent信号时,调用WaitOne()的线程
\ n不要阻止。按回车键显示此信息。\ n’);
控制台。ReadLine();
for(int I=3;I=4;我)
{
Thread t=新线程(Thread proc);
t.name=' Thread _ ' I;
t.start();
}
线程。睡眠(500);
控制台。WriteLine(' \ n按Enter调用Reset(),以便线程再次阻塞'
\ n当他们调用WaitOne()时。\ n’);
控制台。ReadLine();
mre。reset();
//启动一个等待ManualResetEvent的线程。
线程t5=新线程(Thread proc);
t5。Name=' Thread _ 5
t5。start();
线程。睡眠(500);
控制台。WriteLine(' \ n按Enter调用Set()并结束演示。);
控制台。ReadLine();
mre。set();
//如果在Visual Studio中运行此示例,请取消对以下行的注释:
//控制台。ReadLine();
}
私有静态void ThreadProc()
{
字符串名称=线程。当前线程名称;
控制台。WriteLine(name '启动并调用mre。wait one()');
mre。wait one();//阻塞线程,直到调用Set方法。
控制台。WriteLine(name '结束。);
}
}
结果如下
流程:
该示例以信号state ManualResetEvent开始(false被传递给构造函数)。三个线程,每个线程在调用其WaitOne方法时都被阻塞。当用户按Enter键时,该示例调用Set方法,该方法释放所有三个线程以继续执行。
再次按下“输入”键。此时,ManualResetEvent将保持终止状态,直到调用Reset方法,因此这些线程在调用WaitOne方法时不会被阻塞,而是会运行到完成。即对应上述(收到信号时必须手动复位事件)。
再次按enter将导致该示例调用Reset方法并启动一个线程,当调用WaitOne时,该线程将被阻止。回车,最后一次调用Set释放最后一个线程,程序结束。
如果不清楚,可以一步步调试,这样就能明白了!
请参阅MSDN:手动重置事件类别
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。