Re: [心得] delegate();之心得
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
12/21 08:26, 1F
→
12/21 08:27, , 2F
12/21 08:27, 2F
→
12/21 08:27, , 3F
12/21 08:27, 3F
推
12/22 09:30, , 4F
12/22 09:30, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):