Windows Forms控件通常不是thread-safe,因此.NET Framework為防止多個線程下對控件的存取可能導致控件狀態的不一致,在調試時,CLR-Debugger會拋出一個InvalidOperationException以“建議”程序員程序可能存在的風險。當然你也可以忽略InvalidOperationException,在非調試的狀態下,該異常並不會被拋出,CLR-Debugger監測對Handle的可能存在的不一致地存取,而期望達到更穩健的代碼。處理這個問題有兩種方法:第一,在某些情況下,我們並不需要這種“建議”,而這種建議將在調試時帶來不必要的麻煩;第二,順應“建議”,調整編程模型。
解決方法:
1、在窗體的構造函數中加入或者在應用程序的Main中加入
從而忽略Cross-thread InvalidOperationException建議。
2、接受Cross-thread InvalidOperationException善意的建議,利用System.ComponentModel.ISynchronizeInvoke的InvokeRequired和Invoke方法,該代碼對於大多數Windows控件有效,這樣做的目的是保證由創建控件的Main Thread唯一性地呼叫get_Handle。
private void SafeSetText(string text)
{
if (this.InvokeRequired)
{
_SafeSetTextCall call = delegate(string s)
{
this.textBox1.Text = s;
};
this.Invoke(call, text);
}
else
this.textBox1.Text = text;
}
private delegate void _SafeSetTextCall(string text);