C#中AutoResetEvent、reset、set、waitone、start用法
时间: 2025-02-09 15:05:27 浏览: 34
### C# 中 AutoResetEvent 的方法详解
#### 方法概述
AutoResetEvent 是一种同步原语,用于控制线程间的简单信号通知机制。主要涉及的方法有 `Set()`、`WaitOne()` 和 `Reset()`。
#### Set() 方法
此方法将事件的状态设置为已终止(signaled),从而允许一个等待中的线程继续运行。一旦有一个线程被释放,该事件会自动返回到未终止状态[^1]。
```csharp
autoEvent.Set(); // 将事件设为终止态,唤醒单个等待线程
```
#### WaitOne() 方法
当前线程调用此函数来进入等待模式,直到另一个线程调用了 `Set()` 或者超时时间到达。如果没有指定超时参数,则一直等到事件变为终止状态为止[^4]。
```csharp
bool result = autoEvent.WaitOne(500); // 等待最多500毫秒
if (!result){
Console.WriteLine("Timeout occurred.");
}
else{
Console.WriteLine("Thread was signaled.");
}
```
#### Reset() 方法
虽然通常情况下不需要显式调用这个方法,因为每当成功唤醒了一个线程之后,AutoResetEvent 自动将其自身的状态重置为非终止状态。但是仍然可以手动调用来确保事件处于预期的初始条件之下[^2]。
```csharp
autoEvent.Reset(); // 手动把事件设为非终止态
```
#### Start 方法说明
需要注意的是,在讨论 AutoResetEvent 时并没有所谓的 "Start" 方法。可能是指启动新线程的方式之一——使用 Thread 类型对象配合 AutoResetEvent 实现某些特定逻辑场景下的并发处理[^3]。
```csharp
// 创建并初始化 AutoResetEvent 对象,默认是非终止状态
var autoEvent = new System.Threading.AutoResetEvent(false);
// 启动多个工作线程...
for(int i=0;i<5;i++){
int threadNum=i;
var t=new Thread(() => {
Console.WriteLine($"Worker {threadNum} waiting...");
autoEvent.WaitOne();
Console.WriteLine($"Worker {threadNum} working now!");
});
t.Start();
}
// 主线程稍作延迟后发出信号给其中一个子线程
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Signaling one worker to proceed...");
autoEvent.Set();
// 继续让其他工人依次获得机会执行任务
foreach(var _ in Enumerable.Range(0,4)){
System.Threading.Thread.Sleep(1000);
autoEvent.Set();
}
```
阅读全文
相关推荐

















