C#使用集合时线程安全的最佳实践(已经不是并发)

我的问题更像是我想与其他人确认的事情,所以我确信我得到了正确的答案.
如果要进行非线程安全操作(例如枚举集合),最好的方法调用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<>)不支持它,这是您的主要线索.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...