ManualResetEvent怎么在c#中使用

  介绍

这期内容当中小编将会给大家带来有关ManualResetEvent怎么在c#中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

简单介绍

 ManualResetEvent怎么在c#中使用“> </p> <p>,,,,多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当控制线程调用集()方法,所有等待线程将恢复并继续执行。</p> <h3> ManualResetEvent是如何工作的</h3> <p>,,,在内存中保持着一个bool值,如果bool值为False,则使所有线程阻塞,反之,如果bool值为True,则使所有线程退出阻塞。当我们创建ManualResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化ManualResetEvent的例子。</p> <pre类= 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#中使用