锁定/并发问题

Hos*_*146 3 c# concurrency multithreading locking

我有以下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.       }
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.一旦'bandEdgeList'填充在第3行,如果另一个线程修改了CicApplication.BandEdgeCache的内容,'bandEdgeList'的内容是否会失效?我在CicApplication.BandEdgeCache getter/setter中有一个锁.但是我想知道是否应该锁定这段代码,以便在我使用'bandEdgeList'时CicApplication.BandEdgeCache的内容不会改变.

Dan*_*ite 5

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

一旦ToList被调用,它就会保存这些引用的副本.但是如果BandEdgeCache在发生这种情况时另一个线程会修改,那么就会发生不好的事情

所以,你应该锁定所有引用BandEdgeCache.

但是沿着保存列表的行,这将是安全的,但是修改any BandEdge不是没有锁定的线程安全.