在多線程程序中,新創建的線程不能訪問UI線程創建的窗口控件,如果需要訪問窗口中的控件,可以在窗口構造函數中將CheckForIllegalCrossThreadCalls設置為 false
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
也可以針對某一控件進行設置,例如:
TextBox.CheckForIllegalCrossThreadCalls = false;
MSDN說明:
如何:對 Windows 窗體控件進行線程安全調用
使用多線程提高 Windows 窗體應用程序的性能時,必須注意以線程安全方式調用控件。
示例
訪問 Windows 窗體控件本質上不是線程安全的。如果有兩個或多個線程操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。還可能出現其他與線程相關的 bug,包括爭用情況和死鎖。確保以線程安全方式訪問控件非常重要。
.NET Framework 有助於在以非線程安全方式訪問控件時檢測到這一問題。在調試器中運行應用程序時,如果創建某控件的線程之外的其他線程試圖調用該控件,則調試器會引發一個 InvalidOperationException,並提示消息:“從不是創建控件 control name 的線程訪問它。”
此異常在調試期間和運行時的某些情況下可靠地發生。強烈建議您在顯示此錯誤信息時修復此問題。在調試以 .NET Framework 2.0 版之前的 .NET Framework 編寫的應用程序時,可能會出現此異常。
可以通過將 CheckForIllegalCrossThreadCalls 屬性的值設置為 false 來禁用此異常。這會使控件以與在 Visual Studio 2003 下相同的方式運行。
