是否可以在调用WaitOne()之前检查C#System.Threading.AutoResetEvent或 System.Threading.ManualResetEvent的阻塞状态?如何在C#中检查AutoResetEvent或ManualResetEvent的阻塞状态?
回答
EventWaitHandle没有“阻塞状态”。它被设置或重置,没有别的。不,你不能通过调用WaitOne()来检查其他方式。
您可以传递一个0作为超时参数以避免阻塞。这通常是一个非常糟糕的主意,因为它在WaitOne()调用返回后没有提到事件的状态。之后它可能已经改变了一个纳秒。这导致了一种非常讨厌的称为“线程竞赛”的错误。一个Heisenbug。
+1,完全同意你的看法! – 2012-02-17 10:22:58
我知道EventWaithandle没有阻塞状态,但是如果没有发送信号,阻塞当前线程的执行。我在同一个while循环中有4个EventWaitHandles在一个线程中工作。其中一些必须有条件地阻止线程。我想从其他事件知道这4个手柄中的哪一个被阻塞。我看到我必须添加一些链接到句柄的布尔变量来获取这些信息。 – Patrik 2012-02-17 12:06:05
使用
public virtual bool WaitOne(
TimeSpan timeout
)
与超时0。根据MSDN它会立即返回WaitHandle中的状态。
对此的评论。我期望AutoResetEvent上的WaitOne(0)可能会重置它。如果发送信号,则必须在WaitOne之后使用Set。但我必须同意汉斯关于种族条件的看法。如果您有多个称为WaitOne的线程,这可能会导致令人讨厌的错误。 ManualResetEvent没有问题。 – BlueM 2012-02-17 10:41:33
我有同样的问题,真的只是建立一个演示应用程序。 (新手的EventWaitHandle)
这是我如何解决(在VB.NET)问题:
Module Module1
Dim ewh As Threading.EventWaitHandle
Sub Main()
ewh = New Threading.EventWaitHandle(False, Threading.EventResetMode.ManualReset)
' Do other work.
End Sub
Sub checkBlockStatus()
ewh.WaitOne()
End Sub
Function isEwhBlocked() As Boolean
Dim testEwhBlock As New Threading.Thread(AddressOf checkBlockStatus)
testEwhBlock.Start()
Threading.Thread.Sleep(1000)
If testEwhBlock.ThreadState <> Threading.ThreadState.Stopped Then
' It's OK to use abort here because I don't care what happens to the thread.
testEwhBlock.Abort()
Return True
Else
Return False
End If
testEwhBlock = Nothing
End Function
End Module
在您需要检查该实例的阻断状态,只是这样做的任何一点:
if (isEwhBlocked()) Then
' This means the block is on.
else
' No block.
End If
所以,不,你不能真正弄清楚什么是调用了WaitOne()之前受阻,但你可以阻止它抓住你的主线程异步的方式运行。如果等待时间太长,您也可能会稍微降低睡眠值。显然,如果你需要检查多个块,函数会稍微复杂一点(或者你必须创建更多的块),但是这证明了基本原理。我也测试了它作为一个AutoReset,它不工作得很好。由于该处理程序处于自动复位状态,因此一旦我调用该方法来检查该块,它就会重置并阻止其他线程。所以,如果你可以在ManualReset中运行,这可以为你工作。
- 1. 检查AutoResetEvent状态
- 2. autoresetevent和manualresetevent
- 3. 如何在Linux中显示进程状态(阻塞,非阻塞)
- 4. 实现ManualResetEvent和AutoResetEvent
- 5. C fifo保持阻塞状态
- 6. VB.net TCP非阻塞状态
- 7. Oracle侦听状态阻塞
- 8. C#或Python管道阻塞
- 9. FreeRTOS vs Zephyr/Mynewt任务阻塞状态
- 10. 无状态阻塞服务器设计
- 11. 取消状态阻塞字体下载
- 12. 如何在Linux中取消阻塞recv()或recvfrm()函数C
- 13. 池中的池在池填满时进入阻塞状态
- 14. C++检查cdrom状态
- 15. 的AutoResetEvent()在C#
- 16. 检查C#中的防病毒状态
- 17. 如何检查namenode状态?
- 18. 如何检查jqGrid中行的状态
- 19. 谁维护Java中的线程状态从运行到等待/阻塞状态
- 20. 如何阻止NpgsqlDataReader阻塞?
- 21. 检查是否阻塞写入会话
- 22. 检索除了谁被阻塞查询
- 23. 检查pthread线程是否被阻塞
- 24. 检查fgets是否会阻塞
- 25. 如何检查C中的网络设备状态?
- 26. 如何检查c中的信号状态?
- 27. 如何检查C#中的Windows许可证状态?
- 28. 如何检查电子在线状态。
- 29. 是状态机中的阻塞系统调用呼叫事件
- 30. 如何在tensorflow中输入和检索LSTM的状态C/C++
使用反射。你真正的问题是什么? – 2012-02-17 10:09:43
我正在开发与特殊硬件通信的UDP客户端。我必须实现一个阻止代码来同步通信。这些东西必须运行得很快,所以我不能在WaitOne()之前放置一个断点。我有4个AutoResetEvents。当我想知道巫婆之一的沟通块时。我知道写给控制台的信息会显示出哪里,但写作需要时间,在这样的关键环境中,我不能浪费时间。 – Patrik 2012-02-17 11:59:02