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

相关推荐
yugi987838几秒前
基于MATLAB实现神经网络电能扰动信号特征识别
开发语言·神经网络·matlab
小CC吃豆子1 分钟前
Redis 缓存雪崩
数据库
追光天使4 分钟前
元组、列表、字符串、字典定义及切割
开发语言·python
雪花desu11 分钟前
深入 LangChain LCEL 的 10 个核心特性
数据库·人工智能·深度学习·langchain
guygg8811 分钟前
一维信号模糊熵(Fuzzy Entropy)计算原理与MATLAB实现
开发语言·matlab
今夕资源网13 分钟前
go-tcnat内网端口映射 端口穿透 GO语言 免费开源
开发语言·后端·golang·go语言·端口映射·内网端口映射
沛沛老爹15 分钟前
Web开发者快速上手Advanced RAG:索引优化原理与实践
前端·数据库·advanced rag·深度优化·web转型ai
m0_6356474820 分钟前
pyqt5打包报错:qt.qpa.plugin: Could not load the Qt platform plugin “windows“
开发语言·windows·python·qt·pyqt
Tony Bai21 分钟前
告别“If-Else”地狱:OpenFeature 如何重塑 Go 应用的特性开关管理?
开发语言·后端·golang
kylezhao201923 分钟前
C#连接plc之 Model、DAL、BLL、Common三层架构可扩展
开发语言·c#