我有以下C#代码:

1.    List<BandEdge> bandEdgeList;
2.
3.    bandEdgeList = CicApplication.BandEdgeCache.Where(row => row.Coater == coater).ToList();
4.    foreach (BandEdge bandEdge in bandEdgeList)
5.       {
6.          ...
7.          ...
8.       }


我的问题是这个。一旦在第3行中填充了“ bandEdgeList”,如果另一个线程修改了CicApplication.BandEdgeCache的内容,“ bandEdgeList”的内容是否将失效?我在CicApplication.BandEdgeCache getter / setter中有一个锁。但是我想知道是否应该在此代码块周围加锁,以使在使用'bandEdgeList'时CicApplication.BandEdgeCache的内容不会更改。

最佳答案

不是自动的,但这仍然不是线程安全的。它可能抛出InvalidOperationException

调用ToList后,它将保存这些引用的副本。但是,如果在发生这种情况时另一个线程修改了BandEdgeCache,则会发生不良情况。

因此,您应该将所有引用锁定为BandEdgeCache

但是按照已保存列表的方式,这是安全的,但是如果不进行一些锁定,则修改任何BandEdge都不是线程安全的。

07-24 18:27