在调用WaitOne()方法之前,能否检查C# System.Threading.AutoResetEvent或System.Threading.ManualResetEvent的阻塞状态呢?
在调用WaitOne()方法之前,能否检查C# System.Threading.AutoResetEvent或System.Threading.ManualResetEvent的阻塞状态呢?
使用
public virtual bool WaitOne(
TimeSpan timeout
)
设定超时时间为0。根据MSDN,它将立即返回WaitHandle的状态。
我有同样的问题,只是在构建演示应用程序。(对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中运行,这可能适合你。