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

标签 c# multithreading collections synchronization thread-safety

我的问题更像是我想与其他人确认的问题,因此我确定我得到了正确的答案。 当您想进行非线程安全操作(例如对集合进行枚举)时,最好的做法是调用 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/

相关文章:

c# - Convert.ToDouble() 因 SqlDataReader 值溢出

来自 .csv 文件的 Java 工资总和

multithreading - 更改 Julia 的 Jupyter Notebooks 的 VS Code 的 settings.json 中的线程

java - 使用 springframework 的不良 JUnit 测试具有脆弱的 Thread.sleep() 调用。怎么修?

C pthread_join() 产生段错误

java - 无法使用 Collections(Java) 对文件名将包含时间戳的文件列表进行排序

c# - 是否有更优雅的方式将项目安全地添加到 Dictionary<> 中?

c# - 两个程序员在 Visual C# 程序上工作

c# - 如何以 xamarin 形式隐藏 android(返回,主页)的底部栏?

c# - 在wpf后面创建控件异步代码