看起來既AddOrUpdate
和TryUpdate
會工作。
編輯
我可能也錯了。如果是這樣,我認爲文檔沒有足夠清晰的說,所以我們來看看代碼。反射器的禮貌:
public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
{
TValue local;
TValue local3;
if (key == null)
{
throw new ArgumentNullException("key");
}
if (addValueFactory == null)
{
throw new ArgumentNullException("addValueFactory");
}
if (updateValueFactory == null)
{
throw new ArgumentNullException("updateValueFactory");
}
do
{
if (!this.TryGetValue(key, out local3))
{
TValue local2;
local = addValueFactory(key);
if (!this.TryAddInternal(key, local, false, true, out local2))
{
continue;
}
return local2;
}
local = updateValueFactory(key, local3);
}
while (!this.TryUpdate(key, local, local3));
return local;
}
現在,如果更新了工廠現有列表,並返回一個額外成員一個新的,它確實看我,好像這將是原子。如果出現競爭狀況,失敗者將再次更新工廠。我錯了嗎?
你已經在標籤中有C#了。你也不需要把它放在標題中。此外,你的問題與C#4.0無關。 – 2010-07-22 18:57:05