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

相关推荐
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024066 小时前
Bootstrap 警告框
开发语言
2601_949146536 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
陌上丨6 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
曹牧6 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX6 小时前
服务异步通信
开发语言·后端·微服务·ruby
AI_56786 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
zmzb01036 小时前
C++课后习题训练记录Day98
开发语言·c++
ccecw7 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30737 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql