2012-09-21 30 views
1

我有一个类管理自动刷新一些对象,也允许您手动刷新下面的代码。我想让它线程安全。SyncLock是否可以重复使用?

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是可重入,然后嵌套这些将不会是一个问题。 MSDN文档页面似乎意味着情况是这样,但没有明确说明。

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

回答

3

SyncLock语句在引擎盖下使用Monitor.Enter()。在MSDN Library说:

是合法的同一个线程调用输入不止一次没有它阻挡

这意味着它是重入的。易于检查顺便说一句。

+0

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