1
10
编辑:我关于只从一个线程添加就可以了的评论已经有点可疑,原因有二:
当您将“在GUI中迭代”添加到混合中时,它会变得非常棘手,因为您不能在迭代时更改列表。最简单的解决方案可能是提供一个返回 并且UI可以安全地迭代:
|
2
2
此外,如果同时发生两个对addElement的单独调用,也可能导致问题。 对于这种多线程处理,您确实需要在列表本身周围设置某种互斥锁,这样一次只能调用底层列表上的一个操作。 围绕这一点的粗略锁定策略会有所帮助。比如:
|
3
2
您必须注意这里的一些并发技巧。例如,您必须有一个GetEnumerator,它以IList的形式返回一个新实例;不是实际的清单。否则你会遇到问题;应该是这样的:
以及:
注意:在实现线程安全或并行集合(事实上,每个其他类)时,不是从类派生,而是从接口派生!因为总有一些问题和那个类的内部结构或者一些非虚拟的方法有关,所以必须隐藏它们等等。如果必须这样做,请非常小心! |
4
1
在多线程环境中使用锁定并分发集合的副本,或者如果可以使用.Net 4.0,则使用新的并发集合。 |
5
1
当你想清除一个新的列表时,仅仅创建一个新的列表并不是一件好事。
如果清除并添加元素,可以将它们添加到旧列表中,我认为这样可以吗?但如果同时添加两个元素,则可能会遇到问题。
如果使用.Net 4,请查看命名空间System.Collections.Concurrent。在那里您将发现:
您还应该注意,如果不小心,锁会显著降低性能。 |
6
0
从对您的问题的编辑中可以清楚地看出,您并不真正关心这里常见的罪魁祸首——实际上没有同时调用同一对象的方法。 本质上,您是在询问在从并行线程访问列表时是否可以将引用分配给列表。
我认为,尽管如此,仍然有机会,特别是在多处理器环境中,进程将得到损坏的引用,因为它在访问它时只进行了部分更新。 |
Robert King · Unity C#语法问题-转换位置 1 年前 |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
i_sniff_ket · 在unity之外使用unity类 2 年前 |