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)。

相关推荐
安迪小宝3 分钟前
python基础语法13-装饰器
开发语言·前端·python
小八四爱吃甜食3 分钟前
【R语言绘图】圈图绘制代码
开发语言·r语言
残月只会敲键盘4 分钟前
C++ Lambda表达式简明指南:新手快速上手
开发语言·c++
liwulin050622 分钟前
【JAVA】JVM 堆内存“缓冲空间”的压缩机制及调整方法
java·开发语言·jvm
Simon—欧阳34 分钟前
C#异步方法返回Task<T>的同步调用
开发语言·前端·javascript
消失在人海中41 分钟前
oracle 游标的管理
数据库·oracle
michaelzhouh44 分钟前
php调用大模型应用接口实现流式输出以及数据过滤
开发语言·php·php调用大模型api流式输出
小郝 小郝1 小时前
【C语言】浮点数在内存的储存
c语言·开发语言
盖世英雄酱581361 小时前
小小的改动,竟然效率提高了1000倍
数据库·后端
八股文领域大手子1 小时前
从接口400ms到20ms,记录一次JVM、MySQL、Redis的混合双打
jvm·数据库·redis·mysql·jar