C# Winform使用線程改變窗體控件的屬性


Windows Forms控件通常不是thread-safe,因此.NET Framework為防止多個線程下對控件的存取可能導致控件狀態的不一致,在調試時,CLR-Debugger會拋出一個InvalidOperationException以“建議”程序員程序可能存在的風險。當然你也可以忽略InvalidOperationException,在非調試的狀態下,該異常並不會被拋出,CLR-Debugger監測對Handle的可能存在的不一致地存取,而期望達到更穩健的代碼。處理這個問題有兩種方法:第一,在某些情況下,我們並不需要這種“建議”,而這種建議將在調試時帶來不必要的麻煩;第二,順應“建議”,調整編程模型。

解決方法: 

1、在窗體的構造函數中加入或者在應用程序的Main中加入

Control.CheckForIllegalCrossThreadCalls =  false ;

從而忽略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); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM