synclock对集合不起作用吗?

时间:2017-11-09 06:22:18

标签: vb.net multithreading

我有一个多线程程序,其中许多线程可以写入集合,一个线程以固定的时间间隔处理集合。

每隔几个小时,应用程序崩溃就会出现错误,提示"收集已被修改;枚举操作可能无法执行"调试器指向清除集合的方法。

以下是解决此集合的完整代码:

Private ui_add_queue As New List(Of Object)

Private Sub ui_add(recipient_id As String, new_id As String, Optional title As String = "", Optional hue As String = "0.6")
    SyncLock ui_add_queue
        ui_add_queue.Add({recipient_id, new_id, title, hue})
    End SyncLock
End Sub

Private Sub ui_interval_update()
    SyncLock ui_add_queue
        For Each item In ui_add_queue
            root.browser.Document.InvokeScript("logblock_add", item) <- crashes here
        Next
        ui_add_queue.Clear()
    End SyncLock
End Sub

访问集合的两个实例都被一个synclock所包围,这不应该阻止这种事情的发生吗?如何修改集合?

此外,我还提出了一些其他答案,建议克隆该集合,然后处理克隆,但这并非真正100%修复。即使赔率很小,如果集合被一个线程修改而另一个线程正在处理它,一些数据可能会丢失。

1 个答案:

答案 0 :(得分:0)

我最后采用了不同的方法,因为我也无法让synclock工作。在我的情况下,我在我的主线程上做了所有的集合修改。我克隆了集合内容并将它们传递给后台线程以确保安全,然后在主线程上使用invoke包装器和委托函数来对集合执行更改。