我的问题更像是我想与其他人确认的问题,因此我确定我得到了正确的答案。 当您想进行非线程安全操作(例如对集合进行枚举)时,最好的做法是调用 Synchronized 方法(如果该集合存在)。
例如:var syncAL = ArrayList.Synchronized(myAL);
然后你就可以无忧无虑地做一些事情了:
foreach (var item in syncAL){
// Do something
}
现在我个人并没有真正使用 ArrayLists,它只是为了示例,但对于常规列表,Synchronized 方法不存在,所以这里的最佳实践是:
lock (list.SyncRoot){
// non thread-safe operation, e.g:
list.ForEach(item => Console.WriteLine(item.ToString()));
}
因为您当然可以创建自己的任意对象,但是如果您在多个类中使用某个集合对象,您需要确保在所有这些类中使用相同的对象来锁定这似乎是一种非常舒适的方式。
我想确保它确实是最佳实践并且没有遗漏任何东西,然后我将添加我写的内容作为我的团队的开发提示 :)
我对此的理解来源: MSDN SyncRoot
最佳答案
and then you can do something like with no worries:
foreach (var item in syncAL){
// Do something
}
没有。来自 MSDN :
Enumerating through a collection is intrinsically not a thread-safe procedure. Even when a collection is synchronized,
以及核心问题:
I want to make sure it is really the best practice
不,这是一种过时的做法。请注意,SyncRoot 仅限于 ICollection
并且 ICollection<T>
不支持它.较新的收藏 ( List<>
) 不支持它,这是您的主要线索。
关于使用集合时线程安全的 C# 最佳实践(还不是并发的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936476/