我在一个自动刷新某个对象的类中有以下代码,也允许您手动刷新。我想让它成为线程安全的。
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
:如果我们已经在尝试检索一个,我们就不会尝试GetTheFoo()
。我正在使用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
但是,当我致电Synclock
时,我最终会在_syncRoot
ForceRefresh
上尝试Synclock
...现在,如果{{1}}是可重入的,那么嵌套这些将不会成为问题。 MSDN文档页面似乎暗示了这种情况,但没有明确说明。
注意:我会自己尝试一下,但我在StackOverflow上没有看到任何关于此的内容,并认为这是一个有用的问题可以回答。
答案 0 :(得分:4)
SyncLock语句使用底层的Monitor.Enter()。 MSDN库说:
同一个线程在没有阻止
的情况下多次调用Enter是合法的
这意味着它是可重入的。很容易检查顺便说一句。