Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 列表中的修改项属性(结构的)_.net_Vb.net_Winforms_.net 2.0_Generic List - Fatal编程技术网

.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来做一些工作。这是否适用于此?如果应用程序不是多线程的,一个项目怎么会被删除两次?