次のような操作を実行しているバックグラウンド スレッドがあります。
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
プロパティを反復処理する場合があります。
を使用すると、反復中に呼び出された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 )