.net SyncLock是reetrant吗?
我在一个类中有以下代码,该类管理自动刷新某些对象,还允许您手动刷新。我想让它线程安全.net SyncLock是reetrant吗?,.net,vb.net,multithreading,synclock,.net,Vb.net,Multithreading,Synclock,我在一个类中有以下代码,该类管理自动刷新某些对象,还允许您手动刷新。我想让它线程安全 Public Function ForceRefresh() As Foo DoRefresh() ResetTimer() Return Me.CurrentFoo End Function Private Sub DoRefresh() Me._currentFoo = Me._retriever.GetTheFoo() End Sub 我很想Synclock这两种方法: ForceR
Public Function ForceRefresh() As Foo
DoRefresh()
ResetTimer()
Return Me.CurrentFoo
End Function
Private Sub DoRefresh()
Me._currentFoo = Me._retriever.GetTheFoo()
End Sub
我很想Synclock
这两种方法:
:因此我们不会让多个使用者线程同时尝试强制刷新和重置计时器ForceRefresh
<>代码> DoRefresh < /代码>:因此,如果我们已经在尝试检索一个代码,那么我们不尝试<代码> GETHealthFoE()/代码>。我使用的是
System.Threading.Timer
,它可能会回调任何ThreadPool
线程,因此简单地使用一个标志可能并不合适(但可能仍然是必要的?)
。。。像这样:
Private _syncRoot As New Object
Public Function ForceRefresh() As Foo
Synclock _syncRoot
'Snip ...
End Synclock
End Function
Private Sub DoRefresh()
Synclock _syncRoot
'Snip ...
End Synclock
End Sub
但是,当调用ForceRefresh
时,我尝试在\u syncRoot
上进行两次Synclock
。。。现在,如果Synclock
是可重入的,那么嵌套这些将不是问题。文档页面似乎暗示了这种情况,但没有明确说明
注意:我将自己尝试一下,但我在StackOverflow上没有看到任何关于这一点的内容,我认为这是一个有用的问题,需要回答。SyncLock语句在引擎盖下使用Monitor.Enter()。MSDN库说: 同一线程在不阻塞的情况下多次调用Enter是合法的
这意味着它是重新进入的。顺便说一句,易于检查。SyncLock语句在引擎盖下使用Monitor.Enter()。MSDN库说: 同一线程在不阻塞的情况下多次调用Enter是合法的
这意味着它是重新进入的。顺便说一句,很容易查到。你在午餐时也打败了我;)谢谢午饭时你也打败了我;)谢谢