我在一个类中有下面的代码,它管理自动刷新某些对象,这也允许您手动刷新。我想让它安全。
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上打两次电话.现在,如果Synclock是可重入的,那么嵌套就不是问题了。MSDN文档页面似乎暗示了这种情况,但并没有明确说明。
注意:我会自己试一试,但是我在StackOverflow上没有看到任何关于这个的东西,我认为这是一个很有用的问题。
发布于 2012-09-21 17:18:05
SyncLock语句使用遮罩下的Monitor.Enter()。MSDN库说:
同一个线程在不阻塞的情况下多次调用Enter是合法的。
这意味着它是重入者。顺便说一句容易检查。
https://stackoverflow.com/questions/12534467
复制相似问题