EventWaitHandle

在查资料的过程中,我突然想到一个类:EventWaitHandle,也就是本文的主角。

  这个类通过在线程之间设置信号量,可以非常方便的控制线程运行的顺序。具体代码如下:

  首先全局申明:

 EventWaitHandle myHandle = new EventWaitHandle(false, EventResetMode.ManualReset);  //将信号状态置为非终止,使用手动重置

  其次在大数据处理的函数开始加上

 myHandle.Reset();//让其他需要等待的线程阻塞

  末尾加上:

myHandle.Set();  //允许其他等待的线程运行

  具体形式如下:

 private void DealDataInformation(ListView listview,string fileName,EnumX enums) {       myHandle.Reset();//让其他需要等待的线程阻塞    ....................       myHandle.Set();  //允许其他等待的线程运行  }

  其中Reset方法可以让本函数进行处理,而让其他在线程上的未接收到信号量的函数进入阻塞状态,而Set方法则是释放信号量,以便通知阻塞线程当前处理结束,可以继续进行。

  那么怎么控制哪些函数需要阻塞呢? 很简单:

  直接在函数的入口处加上:

private void ColorTheResultAsync(EnumX enums,ListView listview){        myHandle.WaitOne(); //处于等待状态,直到收到Set的信号      .........}
时间: 2024-12-29 13:43:01

EventWaitHandle的相关文章

.NET 同步与异步 之 EventWaitHandle(Event通知) (十三)

本随笔续接:.NET 同步与异步 之 Mutex (十二) 在前一篇我们已经提到过Mutex和本篇的主角们直接或间接继承自 WaitHandle: Mutex类,这个我们在上一篇已经讲过. EventWaitHandle 类及其派生类AutoResetEvent 和 ManualResetEvent,这是本篇的主角. Semaphore 类,即信号量,我们下一篇再讲(忽然觉得没有必要介绍了). WaitHandle提供了若干用于同步的方法.上一篇关于Mutex的blog中已经讲到一个WaitOn

c#多线程同步之EventWaitHandle使用

有这么一个场景,我需要借助windows剪贴板把数据插入到word域中. 实现步骤: 1.把剪贴板数据保存到变量. 2.使用剪贴板实现我们的业务. 3.把变量里的数据存回剪贴板. 但是结果却令人诧异,百思不得其解.插入到word里的数据不是我们想要插入的内容,而是之前剪贴板上的数据.明明第二步一开始就把剪贴板清空了,那旧数据是怎么插入到word中呢?经过我测试,只要执行第一步,就会插入脏数据.我查了下剪贴板的实现原理,它是使用一块应用程序共享的内存,为应用程序之间传递数据. 从结果上看第一步影响

c#多线程之EventWaitHandle再次使用

1 /// <summary> 2 /// 文件传输器,用来获取全文文件,自动根据全文文件数量,开启一定数量的线程,采用生产者消费模式 3 /// </summary> 4 public class FileTranser 5 { 6 private static IFileTranser Transer = new RealFileTranser(); 7 // 文件队列 8 static Queue<FullTextListViewModel> FileTaskQu

EventWaitHandle 第一课

本篇通过一个列子使用EventWaitHandle实现两个线程的同步.请参看下面的列子. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ThreadSynDemo { class Program { private int n1, n2, n3; static void Main(string[] arg

[.net]基元线程同步构造

1 /* 基元线程同步构造 2 用户模式构造: 3 易变构造(Volatile Construct) 4 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制) 5 内核模式构造: 6 事件构造(Event) 7 信号量构造(Semaphore) 8 互斥体构造(Mutex) 9 */ 10 11 //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用

使用事件等待句柄EventWaitHandler 实现生产者、消费者队列

using System; using System.Threading; using System.Collections.Generic; class ProducerConsumerQueue : IDisposable { EventWaitHandle _wh = new AutoResetEvent (false); Thread _worker; readonly object _locker = new object(); Queue<string> _tasks = new

C#中的多线程状态

图1: 线程状态关系图 你可以通过ThreadState属性获取线程的执行状态.图1将ThreadState列举为“层”.ThreadState被设计的很恐怖,它以按位计算的方式组合三种状态“层”,每种状态层的成员它们间都是互斥的,下面是所有的三种状态“层”: 运行 (running) / 阻止 (blocking) / 终止 (aborting) 状态(图1显示)后台 (background) / 前台 (foreground) 状态 (ThreadState.Background)不建议使用

浅谈C#中常见的委托&lt;Func,Action,Predicate&gt;(转)

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不用多废话了. 今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predi

WaitHandle——使用ManualResetEvent

信号量机制 使用ManualResetEvent和AutoResetEvent都继承自EventWaitHandle(继承自waitHandle).EventWaitHandle对象有两个状态:收到信号(signaled)和未收到信号(nonsignaled):EventWaitHandle中的set和reset方法分别用于将eventwaitHandle对象的状态设为收到信号和未收到信号. 当EventWaitHandle未收到信号时,任何线程调用基类的wait方法都会被阻塞,知道eventh