当前位置: 首页 > article >正文

浅谈C#之AutoResetEvent和ManualResetEvent

一、基本介绍

  AutoResetEventManualResetEvent都是同步原语,它们用于线程之间的协调和通信。它们都是从EventWaitHandle类派生的,但它们在重置事件状态的行为上有所不同。

二、简单示例

AutoResetEvent

AutoResetEvent是一个自动重置的事件。当一个线程调用Set方法后,任何等待该事件的线程都会被释放,然后事件会自动回到非信号状态(即,它会自动重置)。这意味着如果只有一个线程在等待,那么这个线程会被释放,如果有更多的线程在等待,那么只有一个线程会被释放,其余的线程会继续等待。

using System.Threading;

class Program
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Thread t = new Thread(DoWork);
        t.Start();

        autoEvent.WaitOne(); // 等待事件被设置
        Console.WriteLine("Main thread is now free to exit.");
    }

    static void DoWork()
    {
        Console.WriteLine("Worker thread is working.");
        autoEvent.Set(); // 设置事件,释放等待的线程
    }
}

ManualResetEvent

ManualResetEvent是一个手动重置的事件。与AutoResetEvent不同,当一个线程调用Set方法后,所有等待该事件的线程都会被释放,但是事件不会自动重置,它将保持在信号状态,直到调用Reset方法。这意味着如果有更多的线程在等待,那么所有等待的线程都会被释放。

using System.Threading;

class Program
{
    static ManualResetEvent manualEvent = new ManualResetEvent(false);

    static void Main()
    {
        Thread t = new Thread(DoWork);
        t.Start();

        manualEvent.WaitOne(); // 等待事件被设置
        Console.WriteLine("Main thread is now free to exit.");
    }

    static void DoWork()
    {
        Console.WriteLine("Worker thread is working.");
        manualEvent.Set(); // 设置事件,释放等待的线程
    }
}

三、使用场景

  • AutoResetEvent:当你希望每次只有一个等待线程被释放时使用。
  • ManualResetEvent:当你希望所有等待线程都被释放时使用,或者你需要在多个地方重置事件状态时使用。


http://www.kler.cn/a/308976.html

相关文章:

  • redis7.x源码分析:(1) sds动态字符串
  • HBase使用create创建表时报错ERROR: KeeperErrorCode = NoNode for /hbase/master
  • 鸿蒙next版开发:ArkTS组件点击事件详解
  • vue2+ element ui 集成pdfjs-dist
  • LLMs 如何处理相互矛盾的指令?指令遵循优先级实验
  • GIS空间分析案例---城市公共设施配置与服务评价
  • 【HTML】Html标签
  • Redis 入门 - 收官
  • 一款.NET开源的i茅台自动预约小助手
  • Python热频随机森林分类器算法模型模拟
  • mac系统安装最新(截止2024.9.13)Oracle JDK操作记录
  • C++速通LeetCode简单第10题-翻转二叉树
  • Flink难点和高阶面试题:Flink的状态管理机制如何保证数据处理的准确性和完整性
  • 一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集
  • FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等
  • kotlin的密封类
  • springboot+redis+缓存
  • 二十种编程语言庆祝中秋节
  • CesiumJS+SuperMap3D.js混用实现通视分析
  • SprinBoot+Vue基于推荐算法的智能书店的设计与实现
  • 车载软件架构 --- SOA设计与应用(下)
  • grafana升级指南
  • vue table id一样的列合并
  • 深度学习和机器学习的区别
  • linux-安全管理-用户认证
  • leetcode 345.翻转字符串中的元音字母