ManualResetEvent使用演示

本文介绍如何利用ManualResetEvent在多线程环境下实现线程间的通信,包括如何初始化、设置和重置ManualResetEvent,以及如何在主线程和子线程间触发信号与等待信号的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

public class EventClient : Form
{
    private Button CreateThreas;
    private ManualResetEvent m_Event1;
    private Button Signal;
    private Button Reset;


    public EventClient()
    {
        InitializeComponent();
        m_Event1 = new ManualResetEvent(false);
    }

    private void InitializeComponent()
    {
        // 
    }
    
    [STAThread]
    static void Main() 
    {
        Application.Run(new EventClient());
    }

    // 创建线程
    private void OnCreateThreads(object sender,EventArgs e)
    {
        ThreadStart threadStart = new ThreadStart(Start);
        Thread thread1 = new Thread(threadStart);            
        thread1.Start();

        Thread thread2 = new Thread(threadStart);            
        thread2.Start();

    }

    // 线程执行体
    protected void Start()
    {
        // 阻塞当前线程线程
        m_Event1.WaitOne();
        
        int threadID = Thread.CurrentThread.GetHashCode();
        string caption = "Thread ID = " + threadID;
        MessageBox.Show("Stopped Waiting",caption); 
    }

    private void OnSignal(object sender,EventArgs e)
    {
        // 通知被m_Event1阻塞的线程继续执行
        // 这里是thread1, thread2
        m_Event1.Set();
    }

    private void OnReset(object sender,EventArgs e)
    {
        m_Event1.Reset();
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值