using System;
using System.Threading;
class Program
{
// 定义一个 AutoResetEvent 对象,初始状态为未触发 (false)
private static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
// 启动一个线程来执行等待事件的任务
Thread thread = new Thread(DoWork);
thread.Start();
// 模拟主线程做其他工作
Console.WriteLine("主线程正在工作...");
Thread.Sleep(2000);
// 触发事件,通知等待的线程继续执行
Console.WriteLine("主线程触发事件...");
autoEvent.Set();
// 等待子线程完成
thread.Join();
Console.WriteLine("所有任务已完成。");
}
static void DoWork()
{
// 等待事件被触发
Console.WriteLine("子线程等待事件...");
autoEvent.WaitOne();
// 事件被触发后,继续执行
Console.WriteLine("子线程收到事件通知,继续执行...");
}
}
AutoResetEvent 是一个同步原语,用于在多线程环境中进行线程间的通信。它有两种状态:触发(signaled)和未触发(nonsignaled)。当某个线程调用 WaitOne()
方法时,如果事件处于未触发状态,该线程会被阻塞,直到事件被触发。
构造函数 new AutoResetEvent(false)
创建了一个初始状态为未触发的 AutoResetEvent
对象。参数为 true
则表示初始状态为已触发。
Set() 方法用于将事件设置为触发状态,允许等待的线程继续执行。
WaitOne() 方法使当前线程进入等待状态,直到事件被触发。一旦事件被触发,线程会继续执行,而事件会自动重置为未触发状态(因此称为 "AutoResetEvent")。
在这个示例中,子线程通过 WaitOne()
等待事件被触发,而主线程通过 Set()
触发事件,通知子线程继续执行。
上一篇:delegate c#
下一篇:c# byte转string
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站