这期内容当中小编将会给大家带来有关ManualResetEvent怎么在c#中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
简单介绍
ManualResetEvent ManualResetEvent =, new ManualResetEvent(假);
在上面代码中,我们初始化了一个值为假的ManualResetEvent对象,这意味着所有调用WaitOne放的线程将被阻塞,直到有线程调用了集()方法。而如果我们用真实值来对ManualResetEvent对象进行初始化,所有调用WaitOne方法的线程并不会被阻塞,可以进行后续的执行。
WaitOne方法
,,该方法阻塞当前线程并等待其他线程发送信号。如果收到信号,它将返回真,反之返回错误的。以下演示了如何调用该方法。
manualResetEvent.WaitOne ();
在WaitOne方法的第二个重载版本中,我们可以指定当前线程等待信号的时间间隔。如果在时间间隔内,没有收到信号,方法将返回假并继续执行。以下代码演示了带时间间隔参数的WaitOne调用。
bool isSignalled =, manualResetEvent.WaitOne (TimeSpan.FromSeconds (5));
我们指定了5秒作为WaitOne方法的参数,如果manualResetEvent对象在5秒内收到信号,它将isSignalled赋值为假的。
设置方法
,,该方法用于给所有等待线程发送信号。设置()方法的调用使得ManualResetEvent对象的bool变量值为真,所有线程被释放并继续执行。下面是调用的例子:
manualResetEvent.Set ();
重置方法
,,一旦我们调用了ManualResetEvent对象的设置()方法,它的bool值就变为真,我们可以调用复位()方法来重置该值,重置()方法重置该值为假的。以下是调用重置方法的例子:
manualResetEvent.Reset ();
如果我们想多次发送信号,那么我们必须在调用集()方法后立即调用复位()方法。
ManualResetEvent例子
,,,下面的例子展示了如何使用ManualResetEvent来释放多个线程。我们用假值实例化了ManualResetEvent对象,它将阻塞所有调用WaitOne方法的线程。我们创建了两个线程,它们调用方法GetDataFromServer,并以服务器数量作为参数。
,,,,,在调用WaitOne方法获取第一批数量后,两个线程均等待来自调用WaitOne线程的信号。当控制线程调用manualrestEvent对象的设置方法,两个线程均被释放并继续运行。在调用集方法后,我们立即调用了重置方法,这将改变manualrestEvent对象的bool值为假,所以,如果线程再次调用WaitOne方法,他们仍然会被阻塞。
,,,在从服务器获取第二批数据后,两个线程均调用了WaitOne方法。在2秒后,控制线程再次调用集方法释放两个线程。
class 程序 { static 才能ManualResetEvent ManualResetEvent =, new ManualResetEvent(假); , static 才能;void Main (string [], args) {才能 ,,,Task Task =, Task.Factory.StartNew((),=比; ,,,{ ,,,,,GetDataFromServer (1); ,,,}); , ,,,Task.Factory.StartNew((),=比; ,,,{ ,,,,,GetDataFromServer (2); ,,,}); , , ,,,//Send first signal 用get first set of data 得到server 1,以及server 2 ,,,manualResetEvent.Set (); ,,,manualResetEvent.Reset (); , ,,,thread . sleep (TimeSpan.FromSeconds (2)); ,,,//Send second signal 用get second set of data 得到server 1,以及server 2 ,,,manualResetEvent.Set (); , ,,,Console.ReadLine (); , ,,,/*,结果 ,,,,,*,小姐:get first data 得到server1 ,,,,,*,小姐:get first data 得到server2 ,,,,,*,小姐:get second data 得到server1 ,,,,,*,小姐:get second data 得到server2 ,,,,,*,All 从而data collected 得到server2 ,,,,,*,All 从而data collected 得到server1 ,,,,*/,,} , static 才能;void  GetDataFromServer (int 中) {才能 ,,,//Calling any webservice 用get 数据 ,,,Console.WriteLine(“小姐:get first data 得到server", +,中); ,,,manualResetEvent.WaitOne (); , ,,,thread . sleep (TimeSpan.FromSeconds (2)); ,,,Console.WriteLine(“小姐:get second data 得到server", +,中); ,,,manualResetEvent.WaitOne (); ,,,Console.WriteLine (“All 从而data collected 得到server", +,中); ,,} }ManualResetEvent怎么在c#中使用