C#小功能之AutoResetEvent和ManualResetEvent,线程管理

此代码示例展示了如何利用AutoResetEvent和ManualResetEvent进行线程同步,控制线程间的执行顺序。在付钱和取书的线程中,通过设置和等待信号来协调操作。AutoResetEvent在信号被释放后会自动重置,而ManualResetEvent需要手动重置。程序演示了两者在多线程同步中的不同应用。

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

vs2015-》新建控制台项目-》代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace AutoResetEvent_test
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread payMoneyThread = new Thread(new ThreadStart(PayMoneyProc));
            payMoneyThread.Name = "付钱线程";
            Thread getBookThread = new Thread(new ThreadStart(GetBookProc));
            getBookThread.Name = "取书线程";
            payMoneyThread.Start();
            getBookThread.Start();

            for (int i = 1; i <= numIterations; i++)
            {
                Console.WriteLine("客户{0}选好了书", i);
                number = i;
                //Signal that a value has been written.
                myResetEvent.Set();
                Thread.Sleep(0);
                ChangeEvent.Set();
                Thread.Sleep(5);
            }
            payMoneyThread.Abort();
            getBookThread.Abort();
            Console.ReadKey();
        }
        const int numIterations = 50;
        static AutoResetEvent myResetEvent = new AutoResetEvent(false);
        static AutoResetEvent ChangeEvent = new AutoResetEvent(false);
        //static ManualResetEvent myResetEvent = new ManualResetEvent(false);
        //static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
        static int number; //这是关键资源

     

        static void PayMoneyProc()
        {
            while (true)
            {
                myResetEvent.WaitOne();
                //myResetEvent.Reset();
                Console.WriteLine("{0}:客户{1}付钱", Thread.CurrentThread.Name, number);
            }
        }
        static void GetBookProc()
        {
            while (true)
            {

                ChangeEvent.WaitOne();
                // ChangeEvent.Reset();               
                Console.WriteLine("{0}:客户{1}取书", Thread.CurrentThread.Name, number);
                Console.WriteLine("------------------------------------------");
                Thread.Sleep(0);
            }
        }
    }
}
    

在这里插入图片描述

通过控制AutoResetEvent set的先后顺序,管理线程运行的顺序,和时间。

AutoResetEvent与ManualResetEvent的区别

他们的用法\声明都很类似:
Set方法将信号置为发送状态
Reset方法将信号置为不发送状态
WaitOne等待信号的发送。其实,从名字就可以看出一个手动,
一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子:

public AutoResetEvent autoevent=new AutoResetEvent(true);
public ManualResetEvent manualevent=new ManualResetEvent(true);

默认信号都处于发送状态,
autoevent.WaitOne();
manualevent.WaitOne();
ManualResetEvent在WaitOne();进入之后需要增加Reset方法,才能执行下一次set方法,否者set方法无效。而AutoResetEvent会自动Reset方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值