.Net Synclock读取方法仅在更新时

时间:2017-10-13 15:54:31

标签: .net vb.net multithreading

如何在没有锁定的情况下允许从多个线程同时调用方法,但是在调用其他方法时它将锁定哪个方法?

示例:

Private DataLock As New Object()

Private Function GetInfo() As String
    SyncLock DataLock 
        'Read existing data and return a String
    End SyncLock
End Function

Private Sub UpdateData()
    SyncLock DataLock 
        'Update/Change existing Data
    End SyncLock
End Sub

如何修改上述代码,以便:

  • UpdateData()在调用时始终触发锁定,锁定自身和GetInfo
  • GetInfo()不会锁定自身(因此它可以在多个线程上同时运行),但它会锁定UpdateData直到完成

1 个答案:

答案 0 :(得分:3)

这是您使用ReaderWriterLockSlim类发布的代码的直接类比:

Private dataLock As New ReaderWriterLockSlim()

Private Function GetInfo() As String
    dataLock.EnterReadLock()

    Try
        'Read existing data and return a String
    Finally
        dataLock.ExitReadLock()
    End Try
End Function

Private Sub UpdateData()
    dataLock.EnterWriteLock()

    Try
        'Update/Change existing Data
    Finally
        dataLock.ExitWriteLock()
    End Try
End Sub

您可能需要考虑Try方法,它们允许您指定等待锁定的最长时间。