オブジェクトの自動更新を管理するクラスに次のコードがあり、手動で更新することもできます。スレッドセーフにしたい。
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
しかし、それから私は電話をするときに2回Synclock
オンにしようとすることになります...今、再入可能であれば、これらをネストすることは問題にはなりません。MSDNのドキュメントページは、これが事実であることを示唆しているようですが、明示的には述べていません。_syncRoot
ForceRefresh
Synclock
注:これを自分で試してみるつもりですが、StackOverflowでこれについて何も表示されなかったため、回答しておくと便利な質問だと思いました。