C# AutoResetEvent

AutoResetEventC# 中的一个同步原语,用于在线程之间传递信号。当线程调用 AutoResetEventWaitOne 方法时,它会阻塞,直到另一个线程调用 Set 方法来释放它。一旦 WaitOne 方法返回,AutoResetEvent 将自动重置其状态,这意味着下一个调用 WaitOne 的线程将再次阻塞,直到 Set 被再次调用。

这是它的一个简单用途示例:

csharp 复制代码
using System;  
using System.Threading;  
  
class Program  
{  
    static AutoResetEvent autoEvent = new AutoResetEvent(false);  
  
    static void Main()  
    {  
        Thread thread1 = new Thread(DoWork);  
        thread1.Start();  
  
        // 等待一段时间,确保 thread1 已经开始执行并阻塞在 autoEvent.WaitOne();  
        Thread.Sleep(1000);  
  
        // 释放 thread1,使其继续执行  
        autoEvent.Set();  
  
        thread1.Join();  
    }  
  
    static void DoWork()  
    {  
        Console.WriteLine("Thread is waiting...");  
        autoEvent.WaitOne(); // 线程将在这里阻塞,直到 autoEvent.Set() 被调用  
        Console.WriteLine("Thread has been released and is now doing work...");  
    }  
}

在上面的示例中,我们创建了一个 AutoResetEvent 实例并将其初始状态设置为 false。然后,我们启动了一个新线程来执行 DoWork 方法。在这个方法中,线程调用 autoEvent.WaitOne() 并阻塞。主线程等待一段时间以确保 DoWork 方法已经开始执行并阻塞,然后调用 autoEvent.Set() 来释放它。一旦 Set 被调用,DoWork 方法中的 WaitOne 将返回,线程将继续执行并输出消息。

ManualResetEvent 不同,AutoResetEvent 在释放一个等待的线程后会立即重置,这意味着下一个调用 WaitOne 的线程将再次阻塞,直到 Set 被再次调用。而 ManualResetEvent 在没有显式调用 Reset 方法的情况下会保持其状态(无论是 true 还是 false)。

相关推荐
2501_933329553 小时前
媒介宣发技术实践:Infoseek舆情系统的AI中台架构与应用解析
开发语言·人工智能·架构·数据库开发
zxrhhm3 小时前
MySQL 8.4 LTS 数据库巡检脚本
数据库·mysql
AI木马人3 小时前
9.【AI任务队列实战】如何在高并发下保证系统不崩?(Redis + Celery完整方案)
数据库·人工智能·redis·神经网络·缓存
[J] 一坚4 小时前
嵌入式高手C
c语言·开发语言·stm32·单片机·mcu·51单片机·iot
odoo中国4 小时前
Odoo 19技术教程 : 如何在 Odoo 19 中创建 Many2one 组件
开发语言·odoo·odoo19·odoo技术·many2one
逻辑驱动的ken4 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
2401_883600254 小时前
golang如何理解weak pointer弱引用_golang weak pointer弱引用总结
jvm·数据库·python
aLTttY4 小时前
【Redis实战】分布式锁的N种实现方案对比与避坑指南
数据库·redis·分布式
2301_773553624 小时前
mysql如何评估SQL语句的索引开销_mysql性能追踪与分析
jvm·数据库·python
njsgcs5 小时前
拆分多实体到装配体 solidworks c#
c#