阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同步方式可分为2种,用户模式构造和内核模式构造。...WaitHandle 在windows编程中,通过API创建一个内核对象后会返回一个句柄,句柄则是每个进程句柄表的索引,而后可以拿到内核对象的指针、掩码、标示等。 ...而WaitHandle抽象基类类作用是包装了一个windows内核对象的句柄。我们来看下其中一个WaitOne的函数源码(略精简)。...理解了WaitHandle其他都好办了,我们来看下它的派生类型。...WaitHandle |——EventWaitHandle 事件构造。
二、FCL提供的内核模式构造层次结构 WaitHandle(抽象类) |——EventWaitHandle |——AutoResetEvent |——ManualResetEvent... |——Semaphore |——Mutex 他们都继承了WaitHandle抽象类,WaitHandle提供了下列共同的静态方法: WaitOne:阻塞调用线程,直到收到一个信号。
WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle...+= delegate(object sender, WorkflowCompletedEventArgs e) { //通知waitHandle...,释放控制台应用程序 waitHandle.Set(); }; //工作流发生错误时触发...) { Console.WriteLine(e.Exception.Message); waitHandle.Set...Workflow1), wf_args); instance.Start(); //让控制台等待工作流的完成 waitHandle.WaitOne
ManualResetEvent(false); mreUdpSend = new ManualResetEvent(false); whUdp = new WaitHandle...whUdp[1] = mreUdpSend; //UDP服务结束命令 int iWaitRetCode; iWaitRetCode = WaitHandle.WaitAny...mreUdpSend.Reset(); break; case WaitHandle.WaitTimeout...mreUdpShutDown;//UDP结束命令 public static ManualResetEvent mreUdpSend;//UDP发送命令 public static WaitHandle...ManualResetEvent(false); mreUdpSend = new ManualResetEvent(false); whUdp = new WaitHandle
3 同步句柄:WaitHandle WaitHandle可以说是本章中许多同步对象的基类包括前后文中的AutoResetEvent,ManualResetEvent,mutex 和Semaphore...都是其子类, waitHandle是个抽象类,主要的功能从字面上就能看的出来,等待句柄,不错 WaitHandle非常的神奇,它容纳了一个WIN32的内核对象句柄,线程 会等待内核对象的消息,当然内核对象也会等待接收信号...,一旦接收到信号则会通知当前线程,这是一种复杂的操作系统调度原理,大家可以参考 WINDOWS核心编程等书继续深入了解下,本文旨在说明下waitHandle的概念和一些简单的介绍,这里在为waitHandle...: 1 bool WaitOne(): 等待一个通过当前waitHandle指定的内核对象收到信号后返回true,否则返回false 2 bool WaitAll():等待waitHandle...和AutoResetEvent的同步方法 /// class Program { static WaitHandle[] waitHandle
WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle...+= delegate(object sender, WorkflowCompletedEventArgs e) { //通知waitHandle...,释放控制台应用程序 waitHandle.Set(); }; //工作流发生错误时触发...) { Console.WriteLine(e.Exception.Message); waitHandle.Set...typeof(wf1.Workflow1)); instance.Start(); //让控制台等待工作流的完成 waitHandle.WaitOne
关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne...、System.Threading.WaitHandle.WaitAny和System.Threading.WaitHandle.WaitAll ,下面我们一最初学者的角度来看,多线程之间的同步。...之后咱来看看另外几个东东: System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事件变为终止状态; System.Threading.WaitHandle.WaitAny...阻止线程,直到一个或多个指示的事件变为终止状态; System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。...thrd1 = new Thread(new ThreadStart(w.work)); thrd1.Start(); } WaitHandle.WaitAll
WaitHandle介绍 实际上,再C#中 EventWaitHandle 、 Semaphore 、 Mutex 都是抽象类 WaitHandle 的派生类,它提供了一组等待信号的方法和属性。...SignalAndWait() 当调用 WaitHandle 的静态方法 SignalAndWait() 时,会使得当前线程等待一个 WaitHandle 对象的信号,同时设置另一个 WaitHandle...当第一个 WaitHandle 对象收到信号时,当前线程继续执行,同时第二个 WaitHandle 对象变为无信号状态。...的静态方法 WaitAll() 时,它可以等待多个WaitHandle对象的信号,直到所有对象都收到信号或等待超时。...如果WaitHandle对象收到信号,WaitOne()方法返回true,否则返回false。使用简单就不在贴代码段。
ProcessWaitHandle waitHandle = null; try { waitHandle =...new ProcessWaitHandle(m_processHandle); if (waitHandle.WaitOne(0, false)) {...} } finally { if( waitHandle...= null) { waitHandle.Close(); }...internal ProcessWaitHandle( SafeProcessHandle processHandle): base() { SafeWaitHandle waitHandle
console.log('执行完成) } setTimeout(task, 2000); } wait(); 新增需求:要在执行完成之后进行某些特别复杂的操作,代码可能会很多,而且分好几个步骤 function waitHandle...task, 2000); return dtd; // 要求返回deferred对象 } // 注意,这里一定要有返回值 return wait(dtd); } var w = waitHandle...function(){ console.log('ok 2'); }, function(){ console.log('err 2'); }) 当执行dtd.reject()时: var w = waitHandle...}) // 不能链式 w.then(function(){ console.log('ok 2'); }, function(){ console.log('err 2'); }) 上面封装的waitHandle...// 修改 function waitHandle(){ var dtd = $.Deferred(); var wait = function(dtd){ var task = function
class Form1 : Form { private WorkflowRuntime _wfRuntime; private AutoResetEvent _waitHandle...WorkflowTerminatedEventArgs e) { MessageBox.Show(e.Exception.Message); _waitHandle.Set...WorkflowCompletedEventArgs e) { _result = e.OutputParameters["Result"].ToString(); _waitHandle.Set...wfRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1), dic); wfInstance.Start(); _waitHandle.WaitOne
其常用方法如下: 方法 说明 Close() 释放由当前 WaitHandle 占用的所有资源。 Reset() 将事件状态设置为非终止,从而导致线程受阻。...WaitOne() 阻止当前线程,直到当前 WaitHandle 收到信号。...WaitOne(Int32) 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。...WaitOne(Int32, Boolean) 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。
MethodImplOptions.Synchronized)] 2: public static void RenewSessions() 3: { 4: IList waitHandleList = new List(); 5: 6: foreach (var session in CurrentSessionList...(waitHandleList.ToArray()); 43: ClearSessions(); 44: } 45:...我们通过WaitHandle保证所有的并发操作都结束了:我先创建了一个IList对象waitHandleList ,将每个基于session对象的异步操作的WaitHandle添加到该列表...(waitHandleList.Add(result.AsyncWaitHandle);)通过 WaitHandle.WaitAll(waitHandleList.ToArray<WaitHandle
取消线程的执行 取消正在执行中或者阻塞中的线程有多种方法 调用 Thread.Interrupt() 中断线程 调用 CancellationTokenSource.Cancel() 或者超时取消 通过 WaitHandle...(new WaitHandle[] { pool, cts.Token.WaitHandle }, 5000); if (signalIndex == 0) {...控制线程池代码的执行 ThreadPool.RegisterWaitForSingleObject() 提供了一种方法,传入一个 WaitHandle 子类或者定时执行线程池的代码。...ThreadPool.RegisterWaitForSingleObject(are, DoWork, ti, Timeout.Infinite, false); // 也可以不定时执行 ti.WaitHandle...} } } class TaskInfo { public RegisteredWaitHandle WaitHandle { get; set
ManualResetEvent类继承于WaitHandle类,其构造函数的参数可确定对象的初始状态。 Set()和Reset()方法返回一个布尔值,表示是否进行了成功的修改。...m_eventTemporaryTrigger.Reset(); //临时线程处于工作之中时,m_eventTemporaryTrigger始终处于被触发状态 // Trigger.strmain(); WaitHandle...[] events = new WaitHandle[2]; events[0] = m_eventQuitTemporary; events[1...int index = WaitHandle.WaitAny(events); Console.WriteLine(“run no wait”); if (index
AutoResetEvent概念 AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类。...waitOne()方法就继承来自waitHandle类。...waitHandle对象的waitone可以使当前线程进入阻塞状态,等待一个信号。直到当前 waitHandle对象收到信号,才会继续执行。
CancellationToken的WaitHandle属性提供了解答。...WaitHandle类有一个静态方法WaitAny,它可以同时等待多个事件,当多个事件中的任意一个有效时,线程都会从阻塞状态中返回。...CancellationToken)state.CancellationToken; var events = new[] { valueAvailableEvent, cancellationToken.WaitHandle...}; while (true) { var eventIndex = WaitHandle.WaitAny(events); // 处理数据 if (eventIndex == 0) { Console.WriteLine...消费都线程通过WaitHandle.WaitAny方法来同时等待值有效事件或者取消事件,当任意一个事件有效时,线程都将继续,并且通过返回的值来判断发生的事件,并作相应的处理。
System.Threading.WaitHandle.WaitOne() (IL=epilog, Native=0x6EC56AB0+0x12) PresentationCore.dll!...System.Threading.WaitHandle.WaitOne() (IL=epilog, Native=0x6EC56AB0+0x12) PresentationCore.dll!...System.Threading.WaitHandle.WaitOne() (IL=epilog, Native=0x6EC56AB0+0x12) PresentationCore.dll!...System.Threading.WaitHandle.WaitOne() (IL=epilog, Native=0x6EC56AB0+0x12) PresentationCore.dll!...System.Threading.WaitHandle.WaitOne() (IL=epilog, Native=0x6EC56AB0+0x12) PresentationCore.dll!
Mutex 的常用方法如下: 方法 说明 Close() 释放由当前 WaitHandle 占用的所有资源。 Dispose() 释放由 WaitHandle 类的当前实例占用的所有资源。...WaitOne() 阻止当前线程,直到当前 WaitHandle 收到信号。...WaitOne(Int32) 阻止当前线程,直到当前 WaitHandle 收到信号,同时使用 32 位带符号整数指定时间间隔(以毫秒为单位)。...WaitOne(Int32, Boolean) 阻止当前线程,直到当前的 WaitHandle 收到信号为止,同时使用 32 位带符号整数指定时间间隔,并指定是否在等待之前退出同步域。
用户模式构造不是通过WaitHandle实现的,不能跨进程。...在内部,WaitHandle抽象基类拥有一个字段SafeWaitHandle,它就是Windows内核对象的句柄。 WaitHandle在线程同步时被所有线程共享。...无论是事件构造还是信号量,它们都派生自WaitHandle类型。...WaitAny:需要传入一个WaitHandle数组,阻塞调用线程,直到WaitHandle数组中任意一个WaitHandle收到一个信号。如果你没有指定等待时间,则时间是无限长。...WaitAll:需要传入一个WaitHandle数组,阻塞调用线程,直到WaitHandle数组中所有WaitHandle收到信号。如果你没有指定等待时间,则时间是无限长。
领取专属 10元无门槛券
手把手带您无忧上云