在C#中(控制台应用程序)我想保存对象的集合。所有对象都是相同的类型。 我想迭代通过调用每个对象的方法的集合。然后不断重复这个过程。 但是在迭代过程中,可以从列表中添加或删除对象。 (对象本身不会被销毁,只是从列表中删除)。 不确定foreach循环会发生什么......或其他类似的方法。 这个已经被做1000次之前..你能推荐一个可靠的方法吗?线程化和迭代通过更改集合
4
A
回答
0
这是多线程同步的经典案例。
只有坚实的方法和更好的方法才能在循环和列表中添加/删除项目之间同步。
意味着您应该只允许在结束和迭代循环开始时添加/删除!
一些这样的事: -
ENTER SYNC_BLOCK
WAIT FOR SYNC_BLOCK to be available
LOOP for items/ call method on them.
LEAVE SYNC_BLOCK
ENTER SYNC_BLOCK
WAIT FOR SYNC_BLOCK to be available
Add/Delete items
LEAVE SYNC_BLOCK
1
另外也复制为基础的方法。 的算法是这样的:
- 采取锁共享集合
- 副本的所有项目从共享收集到一些地方收集
- 释放锁在共享集合
- 遍历本地收集 项目
这种方法的优点是您可以在共享收集上锁定一段时间(假设共享收集相对较小)。
如果您希望在每个集合项目上调用的方法需要花费相当多的时间才能完成或者可以阻止,那么在共享锁下进行迭代的方法可能会导致阻止想要从共享集合中添加/删除项目的其他线程
但是,如果您想要在每个对象上调用的方法相对较快,那么在共享锁下进行迭代更为可取。
0
我读到这个例子时想到的是你可以使用C5TreeSet
/TreeBag
。它确实需要有一种方法来订购您的物品,但Tree
系列的优势在于它们提供了一种Snapshot
方法(C5.IPersistentSorted
的成员),使您可以轻松制作集合状态的快照而无需做一个完整的重复。
如:
using(var copy = mySet.Snapshot()) {
foreach(var item in copy) {
item.DoSomething();
}
}
C5还提供了一个简单的方法来“适用于所有”,并与.NET 2.0兼容:
using(var copy = mySet.Snapshot()) {
copy.Apply(i => i.DoSomething());
}
需要注意的是快照应布置很重要否则随后对基本集合进行修改会导致性能下降。
这个例子来自非常彻底的C5 Book。
相关问题
- 1. 成员集合迭代线程安全
- 2. 迭代通过Java集合使用jQuery
- 3. 迭代过嵌套集合
- 4. 通过迭代器更改元素
- 5. 通过迭代更改类成员
- 6. 在迭代过程中更改HashMap键
- 7. Scala初始化Java迭代集合
- 8. 迭代通过Python列表对和更新迭代
- 9. 在迭代过程中更改集合中的项目字段会使集合无效吗?
- 10. Java迭代集合
- 11. JQuery - 集合迭代
- 12. backbone.js迭代集合
- 13. vba - 迭代集合
- 14. LINQ WPF绑定跨线程集合更改通知
- 15. 通过迭代
- 16. 在迭代过程中使用线程
- 17. 一个通用适配器迭代项目集合集合
- 18. 如何在谓词上运行多线程集合迭代?
- 19. 迭代并发集合时的线程安全
- 20. 通过迭代在一个foreach中执行更改代码
- 21. 通过散列集迭代的问题
- 22. Backbone.js的不通过收集迭代
- 23. ASP.NET MVC迭代集合中的集合
- 24. 在迭代器上进行迭代并更改值会更改集合中的值吗?
- 25. 迭代通过所有集合并删除它们
- 26. 最简单的方法来迭代通过集合在猫鼬
- 27. 迭代通过可枚举类型的可枚举集合
- 28. 通过事件日志条目集合进行迭代,IndexOutOutOfBoundsException
- 29. 通过节点集合迭代的C#HTML敏捷包(无/错)
- 30. 迭代通过两个并行集合并输出第三个