.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是合法的


这意味着它是重新进入的。顺便说一句,很容易查到。

你在午餐时也打败了我;)谢谢午饭时你也打败了我;)谢谢