Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
Vb.net synclock对集合不起作用吗?_Vb.net_Multithreading - Fatal编程技术网

Vb.net synclock对集合不起作用吗?

Vb.net synclock对集合不起作用吗?,vb.net,multithreading,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 = "",

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

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

以下是处理此集合的完整代码:

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
Private ui\u添加队列作为新列表(对象)
私有子ui_添加(收件人_id为字符串,新_id为字符串,可选标题为字符串=”,可选色调为字符串=“0.6”)
同步锁定用户界面添加队列
添加({recipient\u id,new\u id,title,hue})
端同步
端接头
私有子ui_间隔_更新()
同步锁定用户界面添加队列
对于ui\u添加队列中的每个项目

root.browser.Document.InvokeScript(“logblock_add”,item)我最终采用了另一种方法,因为我也很难让synclock正常工作。在我的例子中,我对我的主线程进行了所有集合修改。为了安全起见,我克隆了集合内容并将其传递给后台线程,然后在主线程上使用invoke-wrapper和delegate函数对集合执行更改。

我最终采用了另一种方法,因为我在让synclock工作时也遇到了问题。在我的例子中,我对我的主线程进行了所有集合修改。为了安全起见,我克隆了集合内容并将其传递给后台线程,然后在主线程上使用invoke wrapper和delegate函数对集合执行更改。

好吧,您错过了一些。右键单击ui\u添加队列并选择“查找所有引用”。要注意重入性,InvokeScript()很容易产生副作用。类似于触发一个事件,该事件将再次调用任一方法。SycLoad不能保护RealEntCur.In,考虑使用命名空间中的一种类型,而不是使用<代码>列表(t)。@ HSPSPANTAN我做了参考搜索,它只列出了2条,这是我发布的,所以它肯定是另一件我甚至不知道从哪里开始的事情。fixing@StevenDoggart是 啊我现在正在使用ConcurrentQueue,它似乎非常适合这项工作。已经测试了一段时间了,到目前为止一切都很好。嗯,你错过了一些。右键单击ui\u添加队列并选择“查找所有引用”。要注意重入性,InvokeScript()很容易产生副作用。类似于触发一个事件,该事件将再次调用任一方法。SycLoad不能保护RealEntCur.In,考虑使用命名空间中的一种类型,而不是使用<代码>列表(t)。@ HSPSPANTAN我做了参考搜索,它只列出了2条,这是我发布的,所以它肯定是另一件我甚至不知道从哪里开始的事情。fixing@StevenDoggart是 啊我现在正在使用ConcurrentQueue,它似乎非常适合这项工作。我已经测试了一段时间,到目前为止一切都很好。这是问题的一个解决方案,但我更感兴趣的是为什么synclock在这个线程中让我失败,因为我在整个项目中都在使用它来处理各种事情,我负担不起怪癖。这是问题的一个解决方案,但我更感兴趣的是为什么synclock在这个线程中让我失败因为我在整个项目中都在用它来做各种各样的事情,我负担不起怪癖。