這問題雖然已經老掉牙了,但Winform新手幾乎會遇到,當程式在跨執行緒執行時,如果直接更新UI上的控制項(control),就會發生下面的狀況:
“跨執行緒作業無效: 存取控制項 ‘textBox’ 時所使用的執行緒與建立控制項的執行緒不同。”
另外一種是如果更新UI的時候,該控制項還沒被初始化,則會顯示下面的訊息:
“視窗控制代碼建立後才能呼叫控制項上的 Invoke 或 BeginInvoke。”
解決方法
第一種,需要呼叫委派去調用UI的執行緒去執行想要的工作。
如果要異步執行可以把Invoke換成BeginInvoke
第二種,需要先判斷Control.IsHandleCreated屬性。
public void Test(string msg)
{
if (IsHandleCreated)
{
Invoke((Action)(() =>
{
textBox.Text = msg;
}));
}
}
以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言