作者qazxsw99 (qazxsw99)
看板C_Sharp
标题[心得] (WPF/WinForm) 跨执行绪存取控制项
时间Mon Feb 4 10:53:55 2008
文章彩色版本...
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)