.net 列表中的修改项属性(结构的)
在(结构)列表中,我必须经常使用此代码修改项的属性.net 列表中的修改项属性(结构的),.net,vb.net,winforms,.net-2.0,generic-list,.net,Vb.net,Winforms,.net 2.0,Generic List,在(结构)列表中,我必须经常使用此代码修改项的属性 Private Sub ChangeState(ByVal ww As WebWorker, _ ByVal NewState As WorkerState) Dim oWBB As WebWorker = ListWebWorkers.Find(Function(item As WebWorker) item.Browser.Name.ToLower = ww.Browser.N
Private Sub ChangeState(ByVal ww As WebWorker, _
ByVal NewState As WorkerState)
Dim oWBB As WebWorker = ListWebWorkers.Find(Function(item As WebWorker) item.Browser.Name.ToLower = ww.Browser.Name.ToLower)
If oWBB.Browser IsNot Nothing Then
ListWebWorkers.Remove(oWBB)
oWBB = ww
oWBB.State = NewState
ListWebWorkers.Add(oWBB)
End If
End Sub
但当两个或多个项调用此子过程时,就会出现问题。在这种情况下,一个项目可能已经被删除。此代码在ui线程中执行,并且必须
那么,有没有更好的方法来修改列表结构中的项目呢
谢谢您必须锁定非线程安全的资源。这可以确保在给定时间只有一个线程访问它们
Private Sub ChangeState(ByVal ww As WebWorker, _
ByVal NewState As WorkerState)
SyncLock ListWebWorkers
Dim oWBB As WebWorker = ListWebWorkers.Find(Function(item As WebWorker) item.Browser.Name.ToLower = ww.Browser.Name.ToLower)
If oWBB.Browser IsNot Nothing Then
ListWebWorkers.Remove(oWBB)
oWBB = ww
oWBB.State = NewState
ListWebWorkers.Add(oWBB)
End If
End SyncLock
End Sub
在当前代码中,您没有检查是否存在正确的项(您正在检查
oWBB.Browser
,但您应该检查oWBB
。此外,它不是线程安全的
如果改为使用,则更容易以线程安全的方式验证项的存在
下面是一个重写代码的示例:
' Create a dictionary with case-insensitive keys
Private Shared ListWebWorkers As New System.Collections.Concurrent.ConcurrentDictionary(Of String, WebWorker)(StringComparer.InvariantCultureIgnoreCase)
Private Sub ChangeState(ByVal ww As WebWorker, ByVal NewState As WorkerState)
If ListWebWorkers.ContainsKey(ww.Browser.Name) Then
ListWebWorkers.TryRemove(ww.Browser.Name)
ww.State = NewState
ListWebWorkers.TryAdd(ww.Browser.Name, ww)
End If
End Sub
为什么WebWorker是一个结构而不是一个类?@Meta Knight在一个类中有什么区别,优势是什么?如果WebWorker是一个类,你就不需要删除然后再添加该项。最佳实践是几乎总是使用一个类,除非你有一个不可变的数据结构。该应用程序不是多线程的,而是使用的g多个WebBrowser来做一些工作。这是否适用于此?如果应用程序不是多线程的,一个项目怎么会被删除两次?