C#中ManualResetEvent用法总结

 更新时间:2021年01月30日 10:37:23   作者:旷野风筝少年  
这篇文章主要介绍了C#中ManualResetEvent用法总结,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

简单介绍

     多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当控制线程调用Set()方法,所有等待线程将恢复并继续执行。

ManualResetEvent是如何工作的

    在内存中保持着一个bool值,如果bool值为False,则使所有线程阻塞,反之,如果bool值为True,则使所有线程退出阻塞。当我们创建ManualResetEvent对象的实例时,我们在函数构造中传递默认的bool值,以下是实例化ManualResetEvent的例子。

ManualResetEvent manualResetEvent = new ManualResetEvent(false);

在上面代码中,我们初始化了一个值为False的ManualResetEvent对象,这意味着所有调用WaitOne放的线程将被阻塞,直到有线程调用了 Set() 方法。而如果我们用值True来对ManualResetEvent对象进行初始化,所有调用WaitOne方法的线程并不会被阻塞,可以进行后续的执行。

WaitOne方法

   该方法阻塞当前线程并等待其他线程发送信号。如果收到信号,它将返回True,反之返回False。以下演示了如何调用该方法。

manualResetEvent.WaitOne();

在WaitOne方法的第二个重载版本中,我们可以指定当前线程等待信号的时间间隔。如果在时间间隔内,没有收到信号,方法将返回False并继续执行。以下代码演示了带时间间隔参数的WaitOne调用。

bool isSignalled = manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));

我们指定了5秒作为WaitOne方法的参数,如果manualResetEvent对象在5秒内收到信号,它将isSignalled赋值为False。

Set方法

   该方法用于给所有等待线程发送信号。 Set() 方法的调用使得ManualResetEvent对象的bool变量值为True,所有线程被释放并继续执行。下面是调用的例子:

manualResetEvent.Set();

Reset方法

   一旦我们调用了ManualResetEvent对象的Set()方法,它的bool值就变为true,我们可以调用Reset()方法来重置该值,Reset()方法重置该值为False。以下是调用Reset方法的例子:

manualResetEvent.Reset();

如果我们想多次发送信号,那么我们必须在调用Set()方法后立即调用Reset()方法。

ManualResetEvent 例子

    下面的例子展示了如何使用ManualResetEvent来释放多个线程。我们用false值实例化了ManualResetEvent对象,它将阻塞所有调用WaitOne方法的线程。我们创建了两个线程,它们调用方法GetDataFromServer,并以server数量作为参数。
      在调用WaitOne方法获取第一批数量后,两个线程均等待来自调用WaitOne线程的信号。当控制线程调用manualrestEvent对象的Set方法,两个线程均被释放并继续运行。在调用Set方法后,我们立即调用了Reset方法,这将改变manualrestEvent对象的bool值为false。所以,如果线程再次调用WaitOne方法,他们仍然会被阻塞。
    在从服务器获取第二批数据后,两个线程均调用了WaitOne方法。在2秒后,控制线程再次调用Set方法释放两个线程。

class Program
{
  static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
 
  static void Main(string[] args)
  {
    Task task = Task.Factory.StartNew(() =>
    {
      GetDataFromServer(1);
    });
 
    Task.Factory.StartNew(() =>
    {
      GetDataFromServer(2);
    });
 
 
    //Send first signal to get first set of data from server 1 and server 2
    manualResetEvent.Set();
    manualResetEvent.Reset();
 
    Thread.Sleep(TimeSpan.FromSeconds(2));
    //Send second signal to get second set of data from server 1 and server 2
    manualResetEvent.Set();
 
    Console.ReadLine();
 
    /* Result
      * I get first data from server1
      * I get first data from server2
      * I get second data from server1
      * I get second data from server2
      * All the data collected from server2
      * All the data collected from server1
      */
  }
 
  static void GetDataFromServer(int serverNumber)
  {
    //Calling any webservice to get data
    Console.WriteLine("I get first data from server" + serverNumber);
    manualResetEvent.WaitOne();
 
    Thread.Sleep(TimeSpan.FromSeconds(2));
    Console.WriteLine("I get second data from server" + serverNumber);
    manualResetEvent.WaitOne();
    Console.WriteLine("All the data collected from server" + serverNumber);
  }
}

以上就是C#中ManualResetEvent用法总结的详细内容,更多关于C#中ManualResetEvent用法的资料请关注脚本之家其它相关文章!

相关文章

  • C#程序终极调试实现windbg的时间旅行

    C#程序终极调试实现windbg的时间旅行

    这篇文章主要介绍了C#程序终极调试实现windbg的时间旅行示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C#使用NPOI设置Excel下拉选项

    C#使用NPOI设置Excel下拉选项

    这篇文章主要为大家详细介绍了C#使用NPOI设置Excel下拉选项,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • c#高效比对大量图片的实例代码

    c#高效比对大量图片的实例代码

    以前传统的比较方式是遍历图片中的每一个像素,然后进行比对。这样的比对在少量图片的比对上虽然效率低一点,但是也没有什么不好。但是在大量图片比对的时候,过长的反应时间和对服务器比较高的消耗肯定是不行的,下面介绍下新的方法
    2013-10-10
  • C# 实现WebSocket服务端教程

    C# 实现WebSocket服务端教程

    这篇文章主要介绍了C# 实现WebSocket服务端教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • C# 读取ttf字体文件里的Unicode实现

    C# 读取ttf字体文件里的Unicode实现

    这篇文章主要介绍了C# 读取 ttf字体文件里的 Unicode实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • C# 中 TryParse如何将字符串转换为特定类型

    C# 中 TryParse如何将字符串转换为特定类型

    在 C# 中,TryParse 是一个用于将字符串转换为特定类型的方法,它用于尝试解析字符串并将其转换为指定类型的值,而不会引发异常,这篇文章主要介绍了C# 中 TryParse 将字符串转换为特定类型的方法,需要的朋友可以参考下
    2024-03-03
  • C#中static void Main(string[] args) 参数示例详解

    C#中static void Main(string[] args) 参数示例详解

    这篇文章主要介绍了C#中static void Main(string[] args) 参数详解,本文通过具体示例给大家介绍的非常详细,需要的朋友可以参考下
    2017-03-03
  • c# 类型的字段和方法设计建议

    c# 类型的字段和方法设计建议

    这篇文章主要介绍了c# 字段和方法设计建议,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下
    2020-11-11
  • C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码

    C#版ftp方法实现类的代码...
    2007-04-04
  • C#实现WinForm全屏置顶的示例代码

    C#实现WinForm全屏置顶的示例代码

    我们在运行一些 Windows 应用程序的时候,需要将其运行在窗体置顶的模式,并且进入全屏状态,本文将介绍如何使用 C# 来实现 WinForm 的全屏置顶的基本功能,感兴趣的可以了解下
    2024-12-12

最新评论