2

我在一个管理自动刷新某些对象的类中有以下代码,它还允许您手动刷新。我想让它成为线程安全的。

Public Function ForceRefresh() As Foo
  DoRefresh()
  ResetTimer()
  Return Me.CurrentFoo
End Function

Private Sub DoRefresh()
  Me._currentFoo = Me._retriever.GetTheFoo()
End Sub

我很想使用Synclock这两种方法:

  • ForceRefresh:所以我们不会让多个消费者线程同时尝试强制刷新和重置计时器
  • DoRefreshGetTheFoo(): 所以如果我们已经在尝试检索一个,我们就不会尝试。我正在使用System.Threading.Timerwhich 可能会回调任何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

但是后来我最终在调用时尝试了Synclock两次_syncRoot......ForceRefresh现在如果Synclock是可重入的,那么嵌套这些将不是问题。MSDN文档页面似乎暗示是这种情况,但没有明确说明。

注意:我会自己尝试一下,但我在 StackOverflow 上没有看到任何关于此的内容,并认为这是一个有用的问题需要回答。

4

1 回答 1

4

SyncLock 语句在后台使用 Monitor.Enter()。MSDN 库说:

同一个线程在没有阻塞的情况下多次调用 Enter 是合法的

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

于 2012-09-21T17:18:05.463 回答