Re: [心得] delegate();之心得

看板C_Sharp作者 (wvsrugby)時間15年前 (2008/12/21 02:25), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串3/3 (看更多)
MSDN 中有絕妙的範例, 先判斷 Control.InvokeRequired, 再決定是否需要去 invoke delegate, 不然只是浪費系統資源. public void UpdateStatus(object obj) { if (this.InvokeRequired) { this.Invoke(new Action<object>(UpdateStatus), obj); return; } FileInfo fileInfo = obj as FileInfo; if (fileInfo != null) { //... return; } this.label1.Text = obj.ToString(); } ※ 引述《starlife672 (我愛秋愛我)》之銘言: : 小弟是c#愛用者 : 在開發過程中,往往參雜著多個執行緒在使用 : 我從VS 1.1開始用到現在也只停留在2.0階段 : 沒有想使用3.5的慾望@@ : 因為小弟是從java陣營跳槽支持c#的(真他媽的好丫) : 我相信在執行緒中操作控制項上的內容一定死一堆人 : 一定常出現這種狀況 : ============================================= : System.InvalidOperationException 未處理 : 跨執行緒作業無效: 存取控制項 'tbStatus' : 時所使用的執行緒與建立控制項的執行緒不同。" : ============================================== : 看到這個就相當的火大, 明明在vs 1.1中根本就沒事 : 原本的程式換到了2.0上就死掉了 : 更何況又是很急很急的專案呢~ : 後來去拜見辜狗大神,原來只要加上這個就沒事了 : Control.CheckForIllegalCrossThreadCalls=false; (方法一) : 真的很討厭,在java也都沒事,在2.0上就死掉 : 後來開發到後期,對工具的使用也熟悉到一個階段了 : 開始嘗試比較正規的作法,就是委派事件delegate : ============================================= : //(1).設定好委派事件 : private delegate void ControlDelegate(string id,object obj); : //(2).設定好讓Thread要叫用的方法 : public SetStatus(string id,object obj){ : this.invoke(new ContrlDelegate(this.SetStatusDelegate), : new object[]{id,obj}); : } : //(3).真正執行方法的地方 : private SetStatusDelegate(string id,object obj){ : if(id.Equals("Message")){ : this.label1.Text = (string)obj; : } : else if(id.Equals("FileInfo")){ : FileInfo info = (FileInfo)obj; : } : } : 到時候我只要在Thread中,透過SetStatus("Message","Starlife是帥哥"); : 就ok了 : ============================================= : 這個方法是自己領悟出來的,真神奇有這種方法 : 無法是從Socket哪丟來的訊息,或是從硬体設備丟出來的訊息 : 都可以透過SetStatus的方式去使用,個人蠻prefer這種正規做法 : 不過寫到後面真的會想偷懶,因為要一直去定義一堆有的沒有的id : 很煩的,於是開始愛上匿名方法,也就是 : ============================================ : private delegate void ControlDelegate(); : this.invoke(new ControlDelegate(delegate(){ : //Do Something : })); : 又簡短又有力 : ============================================ : 打完收功,以上只是小弟的小小心得 : 如果有更好的方法,也請諸位大大能不吝請教指點一番 : (好吧我承認我來賺文章數和p幣的) -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.161.33.38

12/21 08:26, , 1F
這才是正確的做法. 想在其他的thread不透過invoke控制
12/21 08:26, 1F

12/21 08:27, , 2F
UI thread的話, 只會產生一些不常出現而且非常難
12/21 08:27, 2F

12/21 08:27, , 3F
reproduce的bug...
12/21 08:27, 3F

12/22 09:30, , 4F
msdn價好用~~~
12/22 09:30, 4F
文章代碼(AID): #19JJX-l2 (C_Sharp)
文章代碼(AID): #19JJX-l2 (C_Sharp)