C#中EventWaitHandle的用法小结

 更新时间:2025年04月15日 10:22:56   作者:wangnaisheng  
EventWaitHandle是C#中用于线程间同步的一个类,它提供了对共享资源的访问控制,以及线程间的同步机制,本文就来介绍一下EventWaitHandle用法,具有一定的参考价值,感兴趣的可以了解一下

EventWaitHandle 是 C# 中用于线程间同步的一个类,它提供了对共享资源的访问控制,以及线程间的同步机制。EventWaitHandle 类位于 System.Threading 命名空间下,主要用于实现互斥访问、信号量控制等场景。

创建 EventWaitHandle

创建一个 EventWaitHandle 需要指定两个参数:初始状态和重置模式。

using System.Threading;

// 创建一个初始状态为未设置的自动重置事件
EventWaitHandle autoEvent = new EventWaitHandle(false, EventResetMode.AutoReset);

// 创建一个初始状态为设置的自动重置事件
EventWaitHandle manualEvent = new EventWaitHandle(true, EventResetMode.ManualReset);

使用 EventWaitHandle

设置和重置事件

  • Set(): 当事件被设置时,所有等待该事件的线程都将被释放。
  • Reset(): 将事件的状态重置为未设置状态。

对于 AutoReset 类型的 EventWaitHandle,一旦设置状态被触发后会立即重置回未设置状态。而 ManualReset 类型则需要显式地调用 Reset() 方法来重置事件。

manualEvent.Reset();
将manualEvent的状态重置为未设置(即信号量为假)。这通常意味着任何正在等待该事件的线程将继续等待。
对于ManualReset类型的EventWaitHandle,这是必须的;否则,即使已经调用了Set()方法,等待中的线程也不会被唤醒。
manualEvent.Set();
将manualEvent的状态设置为已设置(即信号量为真)。如果有任何线程正在等待这个事件,那么它们将不再等待并继续执行。
对于ManualReset类型的EventWaitHandle,状态需要手动重置才能再次等待。

manualEvent.Set(); // 手动设置事件
manualEvent.Reset(); // 手动重置事件

等待事件

  • WaitOne(): 使调用线程进入等待状态,直到事件被设置或者超时(如果指定了超时时间)。
autoEvent.WaitOne(); // 无限期等待事件被设置
bool result = autoEvent.WaitOne(5000); // 在5秒钟内等待事件被设置

如果写为 WaitOne(-1) 表示会使当前线程阻塞,直到manualEvent被设置(即信号量变为真)。
-1表示无限期地等待下去,直到事件被设置。如果想指定一个等待的超时时间,可以使用毫秒值作为参数。

示例

这里提供一个简单的例子来展示 EventWaitHandle 的基本用法:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);

        Thread thread = new Thread(() =>
        {
            Console.WriteLine("Thread is waiting for the signal.");
            eventWaitHandle.WaitOne(); // 线程等待信号
            Console.WriteLine("Thread received the signal and continues execution.");
        });

        thread.Start();

        Thread.Sleep(2000); // 主线程等待两秒后发送信号
        Console.WriteLine("Main thread signals the waiting thread.");

        eventWaitHandle.Set(); // 发送信号
        eventWaitHandle.Close(); // 关闭事件句柄
    }
}

在这个例子中,我们创建了一个手动重置类型的 EventWaitHandle 并在线程中等待信号。主线程等待两秒后发送信号给等待的线程。当信号被发送后,等待的线程继续执行。注意,在使用完毕之后,应该关闭 EventWaitHandle

注意事项

  • EventWaitHandle 可以是命名的,这意味着它可以跨进程使用,但示例中没有展示这一点。
  • 如果使用命名的 EventWaitHandle,请确保正确处理互斥和权限问题。
  • 在使用完 EventWaitHandle 后,应当调用 Close() 方法来释放资源。

到此这篇关于C#中EventWaitHandle的用法小结的文章就介绍到这了,更多相关C# EventWaitHandle内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • c#使用EPPlus封装excel表格导入功能的问题

    c#使用EPPlus封装excel表格导入功能的问题

    这篇文章主要介绍了c#使用EPPlus封装excel表格导入功能的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C#爬虫基础之HttpClient获取HTTP请求与响应

    C#爬虫基础之HttpClient获取HTTP请求与响应

    这篇文章介绍了C#使用HttpClient获取HTTP请求与响应的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中的序列化与反序列化方式

    C#中的序列化与反序列化方式

    本文介绍了C#中的序列化和反序列化概念、目的及其在不同场景中的应用,文章详细讲解了二进制序列化、XML序列化和JSON序列化的方法和特点,并提供了一些示例代码
    2024-12-12
  • 详解Unity安卓共享纹理

    详解Unity安卓共享纹理

    本文主要介绍了Unity安卓共享纹理,对此感兴趣的同学,可以参考下,亲自实验一下,理解其原理。
    2021-05-05
  • 基于C#一个制作图像的特写窗口

    基于C#一个制作图像的特写窗口

    许多网站都会显示一个特写窗口,其中显示放大的图像部分,以便您可以看到更多细节,本文将使用C#制作一个简单的图像的特写窗口,感兴趣的可以了解下
    2025-01-01
  • C#图片加载慢的具体原因和解决方法

    C#图片加载慢的具体原因和解决方法

    这篇文章主要讨论了在C#中优化图片加载的三个关键点:使用异步加载、正确使用图片类和对图片进行适当的压缩和缓存,通过避免这些致命错误,可以显著提高应用程序的性能和用户体验,需要的朋友可以参考下
    2025-11-11
  • C#使用NOPI库实现导入Excel文档

    C#使用NOPI库实现导入Excel文档

    NPOI中N指代的是.Net,POI是一个完全开源的Java写成的库,能够在没有安装微软Office或者相应环境的情况下读写Excel、Word等微软OLE2组件文档,几乎支持所有的Office97~Office2007的文件格式。所以NPOI就是POI项目的.Net版本。
    2017-05-05
  • C#使用Linq to XML处理XML详解

    C#使用Linq to XML处理XML详解

    LINQ to XML是.NET Framework 3.5引入的一种XML编程API,本文将深入探讨LINQ to XML的核心概念、常见操作及最佳实践,需要的小伙伴可以了解下
    2025-07-07
  • 详解C#实例化对象的三种方式及性能对比

    详解C#实例化对象的三种方式及性能对比

    这篇文章主要介绍了C#实例化对象的三种方式及性能对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C# WinForm实现鼠标穿透的操作代码

    C# WinForm实现鼠标穿透的操作代码

    本文介绍了在WinForm开发中实现鼠标穿透功能的方法,主要使用Windows API函数SetWindowLong和GetWindowLong,这些函数已被新版取代,建议使用SetWindowLongPtr和GetWindowLongPtr以保证32/64位系统兼容性,文章详细说明了函数参数及调用方法,需要的朋友可以参考下
    2025-11-11

最新评论