4Manuals

  • PDF Cloud HOME

即使集合被锁定,foreach也会发生InvalidOperationException Download

    获取Hough线的交点OpenCV C ++ 如何将字符串“ text1”设置为包含项目text1,text2,test3的组合框的选定项目? 为什么System.Net.Mail.MailAddress构造函数在域部分中解析带有斜杠“ /”的电子邮件? Android 10,API29:在应用程序文件夹中使用C ++库编写文件会使应用程序崩溃 Unity-LineRenderer没有出现在版本(2D)上 按下按钮后,电话中未显示通知 ASP.net,使用WebConfig httpErrors重定向到区域内的控制器不起作用 获取会议室详细信息 我们如何将参数Line转换为Station? 网络核心:查找实体框架核心的主键和反射

最近,我一直在尝试使用多个线程来创建我的老项目,显然,收藏是其中的一部分。问题在于,一小段代码不断随机崩溃(虽然很少,但仍然足够明显):

enter image description here

Monde是一个SynchronizedCollection,我将其锁定以防止同时写入,但它仍在抱怨它。我有什么想念的吗?

编辑:我知道SynchronizedCollection类仅在创建Enumeration时自动锁定,因此,普通的foreach是不够的,这就是为什么将整个循环括在{ {1}}块。问题在于这样一个事实,即当线程位于lock块内时,集合会以某种方式被修改,这是不应该发生的。

此外,.NET 4并发API下的所有类都不能满足我的所有需求,因此,如果我不想使整个代码库变得比现在更复杂,我真的没有选择。

1 个答案:

答案 0 :(得分:1)

首先,如果您使用的是placement new,则无需将其包装在SynchronizedCollection中,因为它可以在幕后进行带锁操作。第二个lock来自.Net 2.0时代,如果要移植旧代码,则最好使用SynchronizedCollection命名空间中的集合。它们是更新的,更优化的,并且不依赖于锁定和阻止策略。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent?redirectedfrom=MSDN&view=netframework-4.8



Similar searches
    如何从mySQL获取所有年份的列表 通过为pyspark中的数据找到最佳拟合分布来生成随机数 Djoser在用户验证后添加附加功能 在此SQL代码中使用“ INTERSECT”有什么问题 将JSON转换为Python中的列表列表