VB.net:我的线程安全列表解决方案真的安全吗?

时间:2010-06-17 18:09:10

标签: vb.net multithreading collections thread-safety

我已将以下扩展添加到我的项目中,以便创建一个线程安全列表:

扩展 如果我想在我的列表上进行简单的操作

   <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 :(得分:0)

是的,它们看起来是线程安全的。但只有在正确使用时才会变得难以管理。你必须要注意真正小心的死锁情况。

有'最佳实践'声明你不应该锁定列表本身(因为其他代码也可能)并且你打破了这个建议。在实践中不是一个直接的问题,而是潜伏在阴影中等待不太可能的巧合发生的事情。