我看到一個隨機異常「集合被修改;枚舉可能不會執行」 - InvalidOperationException。私有成員變量是否真的在類後面的asp.net代碼中線程安全?
異常指向下面的代碼片段中的foreach行,我知道這發生在枚舉時修改集合。
但是在我的情況下,我沒有看到它發生的真正機會 - 除非私有成員不是線程安全的..我可能是錯誤的,但在這裏我需要幫助理解並計算出。
這裏是我的代碼看起來
我有隱藏類代碼其中有一個私人收藏一樣
private Dictionary<string, string> _someDictionary = SomeConstantClass.ConstantValue;
在頁面預渲染完整的情況下,我列舉的詞典
protected override void OnPagePreRenderComplete(object sender, EventArgs e){
_someDictionary["AnotherKey"] = "Another value";
foreach(var dataValuePair in _SomeDictionary){
//Do some operation
}
}
我也有一個公共財產可以修改這個集合,但它設置在ascx文件中,如
<tc: UserControlA runat="server" id="abc" CustomProperty="true" />
,這裏是它的實現,
public bool CustomProperty{
set{
if (value)
_someDictionary["CustomProperty"] = "Custom Value";
}
}
這當然修改我的成員變量集 - 但按我的理解,這個屬性應該被解僱,並在控制初始化自身完成。
所以,我仍然沒有看到預渲染完成事件期間集合被修改的場景。
任何想法可能導致異常發生?
其他說明:該頁面當然有許多更新面板,雖然這個特定的用戶控件沒有做任何花哨的事情,甚至沒有回發場景。 從日誌中我發現問題發生在對頁面的HTTP GET請求中。
此外:建議我一種方法(如果有的話)來重現這一點。
對於我的朋友誰是興趣知道SomeConstantClass.ConstantValue,這裏是
class SomeConstantClass{
public static Dictionary<string, string> ConstantValue = new Dictionary<string, string> {
{"ABCD", "EFGH"},
{"HIJK", "LMNO"}
};
}
什麼是SomeConstantClass.ConstantValue?這是靜態的嗎? –
有趣的是,你忽略了在我們看起來的第一個地方內執行的實際代碼。 –
@AnonyPegram你有興趣知道什麼是在foreach循環內? – humblelistener