千家信息网

如何使用AutoResetEvent控制线程

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇文章为大家展示了如何使用AutoResetEvent控制线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。AutoResetEvent概念AutoRese
千家信息网最后更新 2026年11月04日如何使用AutoResetEvent控制线程

本篇文章为大家展示了如何使用AutoResetEvent控制线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

AutoResetEvent概念

  • AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类。waitOne()方法就继承来自waitHandle类。

  • AutoResetEvent对象有终止和非终止两种状态,终止状态是线程继续执行,非终止状态使线程阻塞,可以调用set和reset方法使对象进入终止和非终止状态。-》可以简单理解如果AutoResetEvent对象是终止状态,就像不管别人了,任你撒野去(waitOne()得到的都是撒野信号)

  • AutoResetEvent顾名思义,其对象在调用一次set之后会自动调用一次reset,进入非终止状态使调用了等待方法的线程进入阻塞状态。-》可以简单理解如果AutoResetEvent对象是非终止状态,就开始管理起别人来了,此时waitOne()得到的信号都是呆在原地不动信号。

  • waitHandle对象的waitone可以使当前线程进入阻塞状态,等待一个信号。直到当前 waitHandle对象收到信号,才会继续执行。

  • set可以发送一个信号,允许一个调用waitone而等待线程继续执行。 ManulResetEvent的set方法可以允许多个。但是要手动关闭,即调用reset();

  • reset可以使因为调用waitone() 而等待线程都进入阻塞状态。

AutoResetEvent主要方法有

  1. AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。 false:无信号,子线程的WaitOne方法不会被自动调用 true:有信号,子线程的WaitOne方法会被自动调用

  2. Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。

  3. Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。

  4. WaitOne(): 阻止当前线程,直到收到信号。

  5. WaitOne(TimeSpan, Boolean) :阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。

有了上面的解释,开始展示代码

//若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false        static AutoResetEvent oddResetEvent = new AutoResetEvent(false);        static AutoResetEvent evenResetEvent = new AutoResetEvent(false);        static int i = 0;        static void Main(string[] args)        {            //ThreadStart是个委托            Thread thread1 = new Thread(new ThreadStart(show));            thread1.Name = "偶数线程";            Thread thread2 = new Thread(new ThreadStart(show));            thread2.Name = "奇数线程";            thread1.Start();            Thread.Sleep(200);            thread2.Start();            Console.Read();
} public static void show() { if (i == 1) evenResetEvent.WaitOne(); while (i <= 100) { int num = i % 2; if (num == 0) { Console.WriteLine("{0}:{1} {2} ", Thread.CurrentThread.Name, i++, num); evenResetEvent.Set(); oddResetEvent.WaitOne(); } else { Console.WriteLine("{0}:{1} {2} ", Thread.CurrentThread.Name, i++, num); //如果此时AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。否则不会被阻止 oddResetEvent.Set(); evenResetEvent.WaitOne(); } } }

结果如下图所示:


上述内容就是如何使用AutoResetEvent控制线程,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

线程 状态 信号 对象 方法 阻塞 控制 成功 事件 内容 可以使 多个 实例 技能 知识 资源 同步 简明 顾名思义 简明扼要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网新科技 互联网科技的 深圳互联网络科技有限公司 齐家互联网科技 亿账通互联网科技 伴你行互联网科技有限公司 互联网科技公司介绍 互联网科技公司招聘 深圳国际航运科技和互联网 温州喔噻互联网科技有限公司 互联网软件和科技 河南猎农互联网科技有限公司 河南住房之家互联网科技 佛山市拉法互联网科技有限公司 山东星卡互联网科技有限公司官网 全球科技与互联网公司市值变化 长沙渺峰互联网科技有限公司 互联网科技对化妆品行业 互联网领先科技成果宣传视频 每日互联网科技新闻 互联网与科技 麻工互联网科技 互联网 科技创业 互联网与医疗科技 互联网科技与大数据专业 燊美集互联网科技有限公司 广州新华互联网科技学校电竞方面 世界互联网领先科技成果获奖 2021世界互联网领先科技成果发布 利用互联网等科技手段
0