[心得] (WPF/WinForm) 跨執行緒存取控制項

看板C_Sharp (C#)作者 (qazxsw99)時間18年前 (2008/02/04 10:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
文章彩色版本... 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)
文章代碼(AID): #17fdv4vu (C_Sharp)
文章代碼(AID): #17fdv4vu (C_Sharp)