[英]Does synclock not work on collections?
我有一个多线程程序,其中许多线程可能写入集合,而一个线程以固定的时间间隔处理该集合。
每隔几个小时,应用程序崩溃,并显示一条错误消息:“已修改集合;枚举操作可能无法执行”,调试器指向清除集合的方法。
这是解决此集合的完整代码:
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
这两个访问集合的实例都被同步锁包围,这是否可以防止这种情况发生? 如何修改集合?
另外,我还提出了一些其他答案,建议先克隆集合,然后再处理克隆,但这并不是100%的修复。 即使几率很小,但是如果一个线程正在修改该集合,而另一个线程也在处理该集合,则某些数据可能会丢失。
我最终采用了另一种方法,因为我也无法使同步锁正常工作。 就我而言,我在主线程上进行了所有集合修改。 为了安全起见,我克隆了集合内容并将其传递给后台线程,然后在主线程上使用invoke包装程序和委托函数对集合进行更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.