浅谈AutoResetEvent的用法

2023-10-19 06:38

本文主要是介绍浅谈AutoResetEvent的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天在看一段DEMO代码的时候发现AutoResetEvent被反复用到,在MSND中查了资料同时到在网上搜到了一个很简短的例子,这个例子帮我理解AutoResetEvent的用法起了不少辅助作用,这里贴出来,希望对大家理解有所帮助:
(代码都已经在VS2005中成功调试通过,注释是我的理解,只能起参考作用,呵呵)

using System;
using System.Threading;
namespace AutoResetEvent_Examples
{class MyMainClass{//初始的时候是没有信号的,这里的意思是指参数falseconst int numIterations = 100; //重复次数设置多少都无所谓,为让大家看清楚设置了100static AutoResetEvent myResetEvent = new AutoResetEvent(false);static int number;static void Main(){//创建并开始一个线程。Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc));myReaderThread.Name = "ReaderThread";myReaderThread.Start();for (int i = 1; i <= numIterations; i++){Console.WriteLine("Writer thread writing value: {0}", i);number = i;//发信号,说明值已经被写进去了。这里的意思是说Set是一个发信号的方法。myResetEvent.Set();//让每次循环当中有些间隔,没有其他作用,可以注释掉Thread.Sleep(1000);}//终止阅读线程。myReaderThread.Abort();}static void MyReadThreadProc(){while (true){//在数据被作者写入之前不会被读者读取//在上次读取之前至少有一次。myResetEvent.WaitOne();Console.WriteLine("{0} reading value: {1}", Thread.CurrentThread.Name, number);}}}
}

下面我会配图进行说明,便于大家更好的理解,AutoResetEvent在使用前必须通过是例化进行初始,如:

AutoResetEvent myResetEvent = new AutoResetEvent(false);
MSDN中讲到,若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false
,如过设置true,也就是说这个Event回自动Reset,那么myResetEvent.WaitOne()就能够在程序一启动就获得运行权;就相当于一启动程序就自动运行了一次myResetEven.Set();
反之,就要等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;

这里我做个实验给大家看,大家会看到,在设置为true的时候会首先看到ReaderThread reading value运行,然后才是Writer thread wrirting出现:

如设置为false就会发现,先出现的是写的信息:

相信大家应该明白它的初始的意义了.
上面我们提到了myResetEven.Set(),这个方法是做什么的呢,其实简单点说就相当于一个开关,如果没有执行set()方法,下面的waitOne()就等不到让它执行的通知,这样一来waitOne后面的语句也不会执行了,waitone()就会傻等下去...一直等到set()执行后才会执行它后面的操作,

我们再次做个实验,把myResetEven.Set()注释掉,结果应该是读的信息永远不会出现,如图:


果然和我们预料的一样,只有写的信息被执行.

if( )
{
......
}


综合起来理解应该是这样,AutoResetEvent提供了一个类似于条件判断的开关来控制线程,

也就是说,如果 AutoResetEvent.Set()上面的线程完全被执行,AutoResetEvent.WaitOne()控制下的线程才被执行.很简单吧!!

这篇关于浅谈AutoResetEvent的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237992

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除