gpt4 book ai didi

.net - SyncLock 是可重复的吗?

转载 作者:行者123 更新时间:2023-12-03 12:52:41 25 4
gpt4 key购买 nike

我在一个管理自动刷新某些对象的类中有以下代码,它还允许您手动刷新。我想让它成为线程安全的。

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 上没有看到任何关于此的内容,并认为这是一个有用的问题需要回答。

    最佳答案

    SyncLock 语句在后台使用 Monitor.Enter()。 MSDN 库说:

    It is legal for the same thread to invoke Enter more than once without it blocking



    这意味着它是可重入的。顺便说一句,很容易检查。

    关于.net - SyncLock 是可重复的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534467/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com