我有一个后台线程正在执行类似于此的操作:
class Client
{
public ReadOnlyCollection<IPAddress> Servers { get; private set; }
void UpdateServers( List<IPAddress> servers )
{
// this will be called on a background thread
this.Servers = new ReadOnlyCollection( servers );
}
}
在主线程上,消费者可能想要迭代Servers
属性。
我知道使用 a ,迭代将是线程安全的,因为如果在迭代期间调用foreach
迭代器,它将属于旧实例。UpdateServers
使用for
循环,可以通过以下方式使迭代变得安全:
var serverList = client.Servers;
for ( int x = 0 ; x < serverList.Count ; ++x )
{
DoSomething( serverList[ x ] );
// ...
}
但我想知道是否有任何方法可以保证编译器将生成(或强制它生成,如果还没有的话)上面的代码,如果消费者决定迭代:
for ( int x = 0 ; x < client.Servers.Count ; ++x )