我有以下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
都不是线程安全的。