【问题标题】:VB.net: Is my Thread Safe List Solution actually safe?VB.net:我的线程安全列表解决方案真的安全吗?
【发布时间】:2010-06-17 18:09:09
【问题描述】:

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

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

   <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)

这些扩展方法是线程安全的还是您有其他建议?它类似于 List.Foreach 采取行动的方法。

【问题讨论】:

    标签: vb.net multithreading collections thread-safety


    【解决方案1】:

    是的,它们看起来是线程安全的。但只有在正确使用的情况下,这可能会变得难以管理。对于死锁情况,您必须非常小心。

    有“最佳实践”声明您不应该锁定列表本身(因为其他代码也可能如此)并且您违反了该建议。在实践中不是一个直接的问题,而是潜伏在阴影中等待一个不太可能的巧合发生的东西。

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 2017-07-24
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多