- 浏览: 634081 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (314)
- 生活 (2)
- c# (37)
- 技术 (3)
- 400电话 (0)
- 400常见问题 (0)
- 400资费 (0)
- html (7)
- css (0)
- 数据库 (7)
- javascript (16)
- php (33)
- asp.net mvc2 (10)
- mysql (9)
- C# 3.0 LinQ (10)
- vs2005或vs2008 (4)
- flash and as3 (7)
- fms (1)
- dedeCMS (11)
- java (33)
- j2me (1)
- swing (1)
- c++ (1)
- jquery easyui (3)
- jquery (5)
- android (29)
- MongoDB (9)
- VtigerCRM (1)
- test (0)
- linux (30)
- nutch (2)
- SqlServer数据库 (2)
- 数据检索 (2)
- java抓取 (11)
- 乐天 (1)
- 淘宝 (1)
- Silverlight4.0 (6)
- sphinx实时索引 (5)
- ecshop (9)
- codeigniter(CI) (3)
- axure6 (1)
- 京东店铺装修教程 (2)
- xpath (1)
- joomla (2)
- bpm (1)
- Bootstrap (2)
- knockout (4)
- ecstore (4)
- css3 (1)
- 微信 (2)
- dede (0)
- soa_edi (1)
- odoo (0)
- web (1)
最新评论
-
骑着蜗牛超F1:
在ie6下报了个stack overflow at line ...
兼容ie6和ie7 的16进制码流在html中显示为图片代码(base64) -
冰之海洋:
好像少了一句代码吧? FloatingFunc.show(th ...
android 一直在最前面的浮动窗口效果 -
yanzhoupuzhang:
连接有问题!
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000) -
whatable:
唉,楼主你都没有搞清楚重量级和轻量级。。。。既然引用了SWT, ...
java swing 内置浏览器打开网页显示flash图表-swt Browser应用 -
yy_owen:
我晕啊,你链接的什么内容额,我要的iis,你链接个视频什么意思 ...
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000)
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。
线程通过调用 AutoResetEvent
上的 WaitOne
来等待信号。如果 AutoResetEvent
处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set
发出资源可用的信号。
调用 Set
向 AutoResetEvent
发信号以释放等待线程。AutoResetEvent
将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止
状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true ;否则为 false 。
通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。下面我们来举一个例子:我去书店买书,当我选中一本书后我会去收费处付钱,
付好钱后再去仓库取书。这个顺序不能颠倒,我作为主线程,收费处和仓库做两个辅助线程,代码如下:
using System; using System.Linq; using System.Activities; using System.Activities.Statements; using System.Threading; namespace CaryAREDemo { class Me { const int numIterations = 550 ; 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 Main() { 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(); ChangeEvent.Set(); Thread .Sleep(0 ); } payMoneyThread.Abort(); getBookThread.Abort(); } 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与ManualResetEvent的区别
他们的用法\声明都很类似,Set方法将信号置为发送状态 Reset方法将信号置为不发送状态WaitOne等待信号的发送。其实,从名字就可以看出一个手动,
一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子:
public AutoResetEvent autoevent=new AutoResetEvent(true);
public ManualResetEvent manualevent=new ManualResetEvent(true);
默认信号都处于发送状态,
autoevent.WaitOne();
manualevent.WaitOne();
如果 某个线程调用上面该方法,则当信号处于发送状态时,该线程会得到信号,得以继续执行。差别就在调用后,autoevent.WaitOne()每次只允许一个线程
进入,当某个线程得到信号(也就是有其他线程调用了autoevent.Set()方法后)后,autoevent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只
有继续等待.也就是说,autoevent一次只唤醒一个线程。而manualevent则可以唤醒多个线程,因为当某个线程调用了set方法后,其他调用waitone的线程
获得信号得以继续执行,而manualevent不会自动将信号置为不发送.也就是说,除非手工调用了manualevent.Reset().方法,则
manualevent将一直保持有信号状态,manualevent也就可以同时唤醒多个线程继续执行。如果上面的程序换成
ManualResetEvent的话,就需要在waitone后面做下reset。
发表评论
-
Java和C#运行命令行并获取返回值 运行bat文件
2015-08-04 10:45 1330Java运行命令行的例子 import java.io.B ... -
c#操作excel后关闭excel.exe的方法
2013-04-10 10:47 920。网上的一种说法,关闭range,关闭worksheet,关 ... -
ddd
2012-05-24 17:30 0CREATE TABLE IF NOT EXISTS `s ... -
C#里 如何序列化与反序列化 hashtable Dictionary及C#连接mysql数据库
2011-08-19 13:24 1367using System.IO; using System. ... -
C# 压缩和解压web空间中的所有文件
2011-08-18 17:20 872using System; using ICSharpC ... -
C# 压缩和解压web空间中的所有代码
2011-08-18 17:17 679using System; using ICSharpCod ... -
自己制作软键盘的几个关键技术解析
2011-05-26 08:40 1077在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入,虽然微 ... -
rtertert
2011-03-22 17:29 0fffffffffffffffffffffffff ... -
C#发送邮件时在正文中插入图片(邮件中直接包含图片)
2011-01-17 16:12 2412#region 发送邮件 ... -
c#生成Excel,可建立sheet,设定sheet名称,调整列宽度
2010-12-17 16:18 2698Excel生成类 ExcelRW.cs usin ... -
C# 取得函数的调用关系
2010-11-25 08:47 1581如何取得C ... -
iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000)
2010-11-18 09:47 91331iis7.0官方安装包下载 iis7时微软为新一代web服务 ... -
简易的文件磁盘管理操作2(文件、文件夹的编辑创建删除移动拷贝重命名)
2010-11-15 17:22 907using System; using System.Dat ... -
简易的文件磁盘管理操作1(文件、文件夹的编辑创建删除移动拷贝重命名)
2010-11-15 17:21 977using System; using System.D ... -
Image和byte[]之间的转换
2010-11-11 17:05 1217image到byte[] 用到memoryStream类 ... -
.net framework--程序打包--打包.net运行库
2010-10-17 21:05 1691VS03默认是不能把.net运行库打包到自己要发布 ... -
WinForm最简单两GridView同步滚动
2010-09-10 10:28 1673今天在园子里看到一个人问,如何让两个DataGridView保 ... -
直接用aspx页面生成的html文件(不用建立自己的html模板)
2010-09-10 09:29 1414public static string Rend ... -
facebook代理软件
2010-09-09 16:32 203facebook代理软件 -
VS2005水晶报表PUSH模式(DataSet)视频教程+源代码工程示例
2010-09-09 08:37 2352本示例包含: 单表模板演示 多表模板演示 子报表演 ...
相关推荐
多线程使用AutoResetEvent
下面的DEMO展示了如何使用`AutoResetEvent`实现多线程执行,主线程等待所有子线程完成后再继续执行其他业务。 ```csharp using System; using System.Threading; class Program { static AutoResetEvent[] ...
可以创建一个 `AutoResetEvent` 实例,当资源可用时,主线程调用 `Set()` 方法,唤醒等待的线程,使用完资源后,`AutoResetEvent` 自动重置,使得其他线程继续等待。 接下来是 `ManualResetEvent`。与 `...
本文将深入探讨如何使用`AutoResetEvent`类实现线程间的同步和异步操作,以及如何在Visual Studio 2008环境下进行有效应用。 ### 一、多线程基础 多线程允许程序同时执行多个任务,提高系统资源利用率和程序响应...
为了确保线程安全,我们需要使用`AutoResetEvent`来同步这些操作。 1. **初始化**:首先,我们创建一个`AutoResetEvent`实例,通常设置为未设置状态(Unsignaled),表示没有任务可处理。例如: ```csharp ...
在提供的"multiThreading"文件夹中,可能包含了一个或多个人工测试用例,用于演示如何在实际项目中使用Mutex和AutoResetEvent。通过分析这些代码,可以深入理解如何在多线程环境中实现同步和互斥,以及如何解决可能...
就知道AutoResetEvent这个东西和线程有关,用于处理线程切换之类,于是决定用AutoResetEvent来处理上面的问题。 于是网上查找相关资料: 原来,AutoResetEvent在.Net多线程编程中经常用到。当某个线程调用WaitOne...
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前...
下面是一个简单的示例,展示了Mutex和AutoResetEvent的使用: ```csharp using System; using System.Threading; class MultiThreadingExample { private static Mutex mutex = new Mutex(); private static ...
搞过C#多线程的人对其中的AutoResetEvent和ManualResetEvent这两个类都理解,其中的WaitOne()方法和Set()以及Reset()方法在线程同步当中用的是比较多的。 AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程...
引入命名空间: ...AutoResetEvent: autoResetEvent.WaitOne();//运行完后,**自动将事件状态设置为无信号** ManualResetEvent: manulResetEvent.WaitOne();//运行完后,**不会自动将事件状态设置为无信号**
在`Program1.cs`中,我们可能看到使用`AutoResetEvent`的示例。`AutoResetEvent`的特点在于,一旦有线程释放信号,只有一个等待的线程会被唤醒,之后自动重置为无信号状态。以下是一个简单的`AutoResetEvent`使用...
总之,通过使用`AutoResetEvent`,开发人员能够在多线程环境中更有效地管理和优化线程间的等待时间,从而提升整个应用程序的性能和稳定性。然而,正确使用这一工具需要深入理解其工作原理和应用场景,以及遵循相应的...
本文将深入探讨`AutoResetEvent`的工作原理、使用场景以及如何在实际项目中应用。 `AutoResetEvent`属于`System.Threading`命名空间,它是一个信号量,可以被一个或多个等待线程用来同步执行。当`AutoResetEvent`的...
本文将重点解析多线程中的线程同步机制,特别是`AutoResetEvent`和`ManualResetEvent`这两种关键同步对象的特性和使用场景。 #### 终止状态与非终止状态:理解线程的生命周期 在多线程编程中,线程的生命周期至关...
在这个例子中,开发者使用了`AutoResetEvent`这一线程同步工具。 `AutoResetEvent`是.NET Framework提供的一个等待句柄,它允许一个或多个线程等待特定事件的发生。当事件发生时(即`Set()`方法被调用),一个等待...
AutoResetEvent signal = new AutoResetEvent(false); // ... signal.Set(); // 通知其他线程可以继续 signal.WaitOne(); // 阻塞当前线程,直到接收到信号 ``` 6. **线程优先级** 尽管可以设置线程的优先级...
- **AutoResetEvent** 和 **ManualResetEvent**:用于线程间的同步,一个线程等待另一个线程发出信号后才能继续执行。 - **CountdownEvent**:计数器事件,当计数值减到零时,所有等待的线程会被唤醒。 7. **线程...