我面對這個代碼的問題:線程安全OfType
enumerable.OfType<Foo>().Any(x => x.Footastic == true);
心不是線程安全的,並拋出一個枚舉已經改變例外。
有沒有解決這個問題的好方法?
已經試過以下,但它沒有總是工作(似乎不經常觸發此)如果您收到一個例外,雖然它枚舉底層集合改變了,給
public class Foo
{
public void DoSomeMagicWithCollection(IEnumerable enumerable)
{
lock (enumerable)
{
enumerable.OfType<Foo>().Any(x => x.Footastic == true);
}
}
}
在這種情況下'enumerable'是什麼?如果你想迭代一個基本上不安全的集合來迭代,那麼無論你做什麼,你都會遇到問題。請注意'OfType'不是這裏的罪魁禍首。 –
僅當某些代碼*更改了可枚舉值時纔會出現此錯誤。你發佈的代碼不會出現,所以它應該是線程安全的。你究竟在哪裏得到例外?什麼是調用堆棧?你如何創建IEnumerable?你有其他代碼修改另一個線程的枚舉嗎? –
無論你對可枚舉做什麼,你都需要一個鎖對象。別的地方你正在修改枚舉而不使用鎖。 – Kevin