首頁 » C#開發 » [C#] Winform跨執行緒更新UI的兩個常見問題

[C#] Winform跨執行緒更新UI的兩個常見問題

作者:

分類:

這問題雖然已經老掉牙了,但Winform新手幾乎會遇到,當程式在跨執行緒執行時,如果直接更新UI上的控制項(control),就會發生下面的狀況:

“跨執行緒作業無效: 存取控制項 ‘textBox’ 時所使用的執行緒與建立控制項的執行緒不同。”

跨執行緒作業無效: 存取控制項 'txt_MessageBox' 時所使用的執行緒與建立控制項的執行緒不同。
跨執行緒作業無效: 存取控制項 ‘txt_MessageBox’ 時所使用的執行緒與建立控制項的執行緒不同。

另外一種是如果更新UI的時候,該控制項還沒被初始化,則會顯示下面的訊息:

“視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke。”

視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke。
視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke。

解決方法

第一種,需要呼叫委派去調用UI的執行緒去執行想要的工作。

    如果要異步執行可以把Invoke換成BeginInvoke

第二種,需要先判斷Control.IsHandleCreated屬性。

public void Test(string msg)
{
    if (IsHandleCreated)
    {
        Invoke((Action)(() =>
        {
            textBox.Text = msg;
        }));
    }
}

以上為學習過程的問題紀錄

如果文章有誤,歡迎前輩留言請不吝指教。

參考資料

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *