我在一个管理自动刷新某些对象的类中有以下代码,它还允许您手动刷新。我想让它成为线程安全的。
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
which 可能会回调任何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 上没有看到任何关于此的内容,并认为这是一个有用的问题需要回答。