Tag: waithandle

C#WaitHandle可取消WaitAll

我有以下代码,其目标是等待所有给定的等待句柄,但可以通过特定的等待句柄取消: public static bool CancelableWaitAll(WaitHandle[] waitHandles, WaitHandle cancelWaitHandle) { var waitHandleList = new List(); waitHandleList.Add(cancelWaitHandle); waitHandleList.AddRange(waitHandles); int handleIdx; do { handleIdx = WaitHandle.WaitAny(waitHandleList.ToArray()); waitHandleList.RemoveAt(handleIdx); } while (waitHandleList.Count > 1 && handleIdx != 0); return handleIdx != 0; } 这仅适用于ManualReset事件。 使用AutoReset事件时,WaitAny会重置所有已发出信号的事件,但仅返回第一个发出信号的事件(根据MSDN)。 任何想法如何在没有轮询的情况下以正确的方式完成AutoReset事件?

WaitHandle.WaitAny和Semaphore类

编辑:我甚至想问这个问题暂时疯狂,但当时有意义(见下面的编辑2)。 对于.NET 3.5项目,我有两种类型的资源( R1和R2 ),我需要检查它的可用性。 每种资源类型可以随时(例如)有10个实例。 当其中一种资源可用时,我的工作线程需要唤醒(存在可变数量的线程)。 在早期的实现中,只有一种资源类型,我使用信号量来检查可用性。 现在我需要等待两个单独的信号量( S1和S2 )来跟踪资源的可用性。 WaitHandle[] waitHandles = new WaitHandle[] { s1, s2 }; int signalledHandle = WaitHandle.WaitAny(waitHandles); switch (signalledHandle) { case 0: // Do stuff s1.Release(); case 1: // Do stuff s2.Release(); } 然而,这有一个问题。 从WaitAny上的MSDN文档: 如果在调用期间发出多个对象的信号,则返回值是信号对象的数组索引,其中所有信号对象的索引值最小。 这表明在调用WaitAny之后我可能会将我的信号量计数减少1。 因为signalledHandle将指示s1已发出信号,我将开始使用资源R1 ,并在完成后释放它。 但是,由于我不知道S2是否已发出信号,因此此资源的可用性计数现在可能已关闭。 如果发生这种情况10次,我的信号量将永久“空”,资源R2将不再使用。 处理这个问题的最佳方法是什么? 我是否应该从使用两个信号量切换到简单计数器,并在任何一个计数器更改时发出AutoResetEvent信号? 我错过了一些更优雅的方法吗? 编辑1: 根据Ravadre的说法,在WaitAny之后,只有一个信号量会被改变。 略微修改他的例子似乎证实了这一点,但有没有人可以指出我指出这个的一些官方文档? 编辑2: […]

Thread.Sleep(timeout)和ManualResetEvent.Wait(timeout)有什么区别?

Thread.Sleep(timeout)和resetEvent.Wait(timeout)都会导致执行暂停至少timeout毫秒,那么它们之间是否存在差异? 我知道Thread.Sleep导致线程放弃其时间片的剩余部分,因此可能导致睡眠持续时间远远超过要求的时间。 ManualResetEvent对象的Wait(timeout)方法是否具有相同的问题? 编辑 :我知道ManualResetEvent的主要要点是从另一个线程发出信号 – 现在我只关注事件的Wait方法的情况,指定了超时,没有其他调用者设置事件。 我想知道是否比Thread.Sleep更准确地唤醒准时

我需要在ManualResetEvent上调用Close()吗?

我一直在阅读.NET Threading,并正在研究一些使用ManualResetEvent的代码。 我在互联网上找到了很多代码示例。 但是,在阅读WaitHandle的文档时,我看到以下内容: WaitHandle实现了Dispose模式。 请参阅实现Finalize和Dispose以清理非托管资源。 没有任何样本似乎在他们创建的ManualResetEvent对象上调用.Close(), 甚至是来自pfxteam博客的好的Recursion and Concurrency文章 ( 编辑 – 这有一个我错过的使用块)。 这只是示例疏忽,还是不需要? 我很好奇,因为WaitHandle“封装了特定于操作系统的对象”,因此很容易出现资源泄漏。