我已将以下扩展添加到我的项目中,以便创建一个线程安全列表:
扩展 如果我想在我的列表上进行简单的操作
<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方法。
答案 0 :(得分:0)
是的,它们看起来是线程安全的。但只有在正确使用时才会变得难以管理。你必须要注意真正小心的死锁情况。
有'最佳实践'声明你不应该锁定列表本身(因为其他代码也可能)并且你打破了这个建议。在实践中不是一个直接的问题,而是潜伏在阴影中等待不太可能的巧合发生的事情。