C# AutoResetEvent

AutoResetEvent 是 C# 中的一个同步原语,用于在线程之间传递信号。当线程调用 AutoResetEvent 的 WaitOne 方法时,它会阻塞,直到另一个线程调用 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)。

相关推荐
这个DBA有点耶9 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
SelectDB9 小时前
时间旅行与快照能力速查:Doris 侧三条落地路径
大数据·数据库·数据分析
SelectDB9 小时前
云数仓成本结构拆解速查:五层计费 vs Doris / 托管形态
大数据·数据库·数据分析
SelectDB9 小时前
什么场景能承接与建议保留:Doris vs Snowflake 边界速查
大数据·数据库·数据分析
这个DBA有点耶11 小时前
DELETE没删多少数据,表却越来越大——InnoDB删除空洞与页合并失效的根因
数据库·mysql·代码规范
玩泥巴的12 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
WJ.Polar15 小时前
Java封装、继承、多态
java·开发语言
ly768915 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠15 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言