Jef*_*f B 3 .net vb.net multithreading synclock
我在一个类中有以下代码,它管理自动刷新某些对象,也允许您手动刷新。我想让它线程安全。
Public Function ForceRefresh() As Foo
DoRefresh()
ResetTimer()
Return Me.CurrentFoo
End Function
Private Sub DoRefresh()
Me._currentFoo = Me._retriever.GetTheFoo()
End Sub
Run Code Online (Sandbox Code Playgroud)
我很想尝试Synclock这两种方法:
ForceRefresh:所以我们不会有多个消费者线程尝试同时强制刷新并重置计时器DoRefreshGetTheFoo():所以,如果我们已经在尝试找回一个,我们就不会尝试这样做。我正在使用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
Run Code Online (Sandbox Code Playgroud)
但后来我在调用时最终尝试了Synclock两次...现在如果是可重入的那么嵌套这些将不再是问题。MSDN文档页面似乎暗示了这种情况,但没有明确说明。_syncRootForceRefreshSynclock
注意:我自己会尝试一下,但我在 StackOverflow 上没有看到任何有关此问题的信息,并且认为这是一个需要回答的有用问题。
SyncLock 语句在底层使用 Monitor.Enter()。MSDN 库说:
同一个线程在不阻塞的情况下多次调用 Enter 是合法的
这意味着它是可重入的。顺便说一句,很容易检查。
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |