我有一個執行類似這樣的操作的後臺線程:成員集合迭代線程安全
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)
我建議不要訪問服務器變量,而是有一個接收閉包並執行迭代本身的方法 - 或者有一個服務器的適當getter,它的名字清楚地表明它應該被調用和存儲變成一個變量,而不是反覆使用。 – entonio 2013-02-20 00:16:24