[心得] (WPF/WinForm) 跨執行緒存取控制項
文章彩色版本...
http://tinyurl.com/3yycus
本文章想與各位版友分享
若有不對的地方請指正
歡迎各式不同的心得交流
=================================================================
在寫WinForm的時候...
若是自創的執行緒會修改到控制項(Control)的屬性(Property)
很多人第一次都會遇見這個例外(Exception)︰
"存取控制項 control name 時所使用的執行緒與建立控制項的執行緒不同"
(The calling thread cannot access this object because a different thread
owns it.)
最普遍的解法是利用控制項的InvokeRequired屬性來做判斷
Ex 1︰
delegate void SetTextCallback(int threadName, string msg);
public void showMsg(int threadName, string msg) {
if (this.textBox1.InvokeRequired) {
SetTextCallback d = new SetTextCallback(showMsg);
this.Invoke(d, new object[] { threadName, msg });
} else {
this.textBox1.Text = threadName + ", " + msg;
}
}
但是到了WPF此方法不再適用
所有的WPF控制項都有一個Dispatcher屬性
而透過呼叫CheckAccess方法來檢查︰
"現在的程式是不是創造此控制項的執行緒來執行的?"
如果不是...就要創一個委派(Delegate)
好讓非原執行緒藉由Dispather invoke(請求?)原執行緒執行委派所指定的目標程式
Ex 2︰
delegate void SetTextCallback(int threadName, string msg);
public void showMsg(int threadName, string msg) {
if (textBox0.Dispatcher.CheckAccess()) {
this.textBox1.Text = threadName + ", " + msg;
} else {
textBox1.Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new SetTextCallback(showMsg), threadName, msg);
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.75.221.7
※ 編輯: qazxsw99 來自: 203.75.221.7 (02/04 10:56)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章