VB.net: действительно ли мое решение для списка безопасных потоков действительно безопасно? - PullRequest
3 голосов
/ 17 июня 2010

Я добавил следующие Расширения в свой Проект, чтобы создать список безопасных потоков:

Расширения Если я хочу выполнить простую операцию в моем списке

   <Extension()> _
    Public Sub Action(Of T)(ByVal list As List(Of T), ByVal action As Action(Of List(Of T)))
        SyncLock (list)
            action(list)
        End SyncLock
    End Sub

Если я хочу передать его более чем одному параметру, я мог бы просто расширить его с помощью большего количества элементов ...

<Extension()> _
Public Sub Action(Of T)(ByVal list As List(Of T), ByVal action As Action(Of List(Of T), T), ByVal item As T)
    SyncLock (list)
        Action(list, item)
    End SyncLock
End Sub

Действия Я создал следующие Примеры действий:

Private Sub Read(Of T)(ByVal list As List(Of T))
    Console.WriteLine("Read")
    For Each item As T In list
        Console.WriteLine(item.ToString)
        Thread.Sleep(10)
    Next
End Sub

, а также тот, который принимает параметр:

Private Sub Write(Of T)(ByVal list As List(Of T), ByVal item As T)
    Thread.Sleep(100)
    list.Add(item)
    Console.WriteLine("Write")
End Sub

Инициирование Затем в моих различных потоках я буду называть свои Действия с:

list.Action(AddressOf Read)

или

list.Action(AddressOf Write2, 10)

Эти методы Extenxion безопасны для потоков или у вас есть другие рекомендации?Он похож на метод List.Foreach, который выполняет действие.

1 Ответ

0 голосов
/ 17 июня 2010

Да, они выглядят поточно-ориентированными. Но только при правильном использовании, и это может стать трудным для управления. Вам придется внимательно следить за ситуациями тупика.

Существует «лучшая практика», утверждающая, что вы не должны блокировать сам список (потому что другой код может также), и вы нарушаете этот совет. Не непосредственная проблема на практике, а нечто скрывающееся в тени, ожидающее маловероятного совпадения.

...