我的问题更像是我想与其他人确认的事情,所以我确信我得到了正确的答案.
如果要进行非线程安全操作(例如枚举集合),最好的方法是调用Synchronized方法(如果该集合存在).
如果要进行非线程安全操作(例如枚举集合),最好的方法是调用Synchronized方法(如果该集合存在).
例如:var syncAL = ArrayList.Synchronized(myAL);
然后你可以做一些无忧无虑的事情:
foreach (var item in syncAL){ // Do something }
现在我个人并不真正使用ArrayLists,它只是用于示例,但对于常规List,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<>)不支持它,这是您的主要线索.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。