Правильный способ использования SyncLock (в общем)

Это продолжение предыдущего вопроса относительно блокировки двух объектов List (Of T). Ответ оказался полезным, но оставил мне еще один вопрос.

Предположим, у меня есть такая функция:

Public Function ListWork() As Integer
  List1.Clear()
  ..Some other work which does not modify List1..
  List1.AddRange(SomeArray)
  ..Some more work that does not involve List1..
  Return List1.Count
End Function

, которая находится в классе, объявляющем List1. Теперь я понимаю, что в многопоточной среде у меня должен быть частный объект блокировки для List1 и блокировать List1 всякий раз, когда он изменяется или перечисляется. У меня вопрос: что делать:

Private List1Lock As New Object
Public Function ListWork() As Integer
  SyncLock List1Lock
    List1.Clear()
  End SyncLock
  ..Some other work which does not modify List1..
  SyncLock List1Lock
    List1.AddRange(SomeArray)
  End SyncLock
  ..Some more work that does not involve List1..
  SyncLock List1Lock
    Dim list1Count As Integer = List1.Count
  End SyncLock
  Return list1Count
End Function

или так:

Private List1Lock As New Object
Public Function ListWork() As Integer
  SyncLock List1Lock
    List1.Clear()
    ..Some other work which does not modify List1..
    List1.AddRange(SomeArray)
    ..Some more work that does not involve List1..
    Dim list1Count As Integer = List1.Count
  End SyncLock
  Return list1Count
End Function

Я предполагаю, что первый пример оптимален?

7
задан rgettman 17 December 2018 в 18:49
поделиться