亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

委托異步調用時BeginInvoke的陷阱處理

2019-11-17 03:13:40
字體:
來源:轉載
供稿:網友

委托異步調用時BeginInvoke的陷阱處理

這個陷阱來自于一個需求:需要異步在后臺處理數據,處理完后觸發處理完成的事件,大概是這么寫的:

EmployeeCollection data = new EmployeeCollection();data.Loaded += data_Loaded;Action<EmployeeCollection> action = (d) => {    DalHelper.Fill(data);    data.RaiseEventLoaded();};action.BeginInvoke(data, null, null);

挺簡單的代碼,陷阱也在其中。假如DalHelper.Fill(data)拋出了一個異常,那么對data.RaiseEventLoaded()就不會執行,依賴于data.Loaded事件的代碼也不會執行,這是一個bug,應該在委托執行中加入一個try...catch語句,或者在某個地方調用委托的EndInvoke方法,來處理執行中可能的異常。

為了這么一個簡單的需求,加入try...catch或者調用委托的EndInvoke都太復雜了,僅僅只想滿足假如執行失敗,就把異常拋出來,即使將當前進程結束也沒事。本著一次編寫,多次使用的原則,專門設計了一個幫助類來專職這類委托的異步調用。幫助類的代碼如下:

public class EventHelper {   public static void UnsafeBeginInvoke(Delegate del,params object[] args){      AsyncFire asyncFire = InvokeDelegate;      asyncFire.BeginInvoke(del, args, ThrowCallback, asyncFire);   }         delegate void AsyncFire(Delegate del,object[] args);    static void InvokeDelegate(Delegate del,object[] args){        del.DynamicInvoke(args);    }   static void ThrowCallback(IAsyncResult ar) {        AsyncFire asyncFire = ar.AsyncState as AsyncFire;       asyncFire.EndInvoke(ar);   }}

核心實現是將委托的調用封裝起來,在另外一個委托中去調用,然后對另外的那個委托用EndInvoke來釋放可能的異常,這樣就能夠發現單純的調用BeginInvoke后委托執行時引發的異常。這樣修改后,剛才的代碼就可以這樣來調用:

EmployeeCollection data = new EmployeeCollection();data.Loaded += data_Loaded;Action<EmployeeCollection> action = (d) => {    DalHelper.Fill(data);    data.RaiseEventLoaded();};EventHelper.UnsafeBeginInvoke(action, data);

代碼還如最初的設計那么簡單,而且真要是委托中發生了異常,也能夠發現這個錯誤,而不是讓這個錯誤被掩蓋。

另外,剛才的實現不是類型安全的,類型安全可以通過重載來解決,例子如下:

public class EventHelper {   public static void UnsafeBeginInvoke(Delegate del,params object[] args){      AsyncFire asyncFire = InvokeDelegate;      asyncFire.BeginInvoke(del, args, ThrowCallback, asyncFire);   }         delegate void AsyncFire(Delegate del,object[] args);    static void InvokeDelegate(Delegate del,object[] args){        del.DynamicInvoke(args);    }   static void ThrowCallback(IAsyncResult ar) {        AsyncFire asyncFire = ar.AsyncState as AsyncFire;       asyncFire.EndInvoke(ar);   }   #region 添加類型安全的委托   public static void BeginInvoke(Action del){      UnsafeBeginInvoke(del);   }   public static void BeginInvoke<T,U>(Action<T,U> del,T t, U u){      UnsafeBeginInvoke(del,t,u);   }   public static void BeginInvoke<T,U,V>(Action<T,U> del,T t, U u, V v){      UnsafeBeginInvoke(del,t,u,v);   }   #endregion 添加類型安全的委托}
View Code

各位同學可以根據自己的需要添加類型安全的實現。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产高清va在线播| 国产精品丝袜久久久久久高清| 国产精品久久在线观看| 在线观看国产精品91| 久久久人成影片一区二区三区| 69av在线播放| 亚洲一品av免费观看| 在线播放精品一区二区三区| 亚洲视频一区二区三区| 欧美老少做受xxxx高潮| 2021国产精品视频| 成人免费大片黄在线播放| 欧美激情奇米色| 国产美女精品免费电影| 亚洲精品在线视频| 久久91亚洲精品中文字幕| 88xx成人精品| 欧美性videos高清精品| 日韩精品在线免费观看视频| 国产成人精品国内自产拍免费看| 中文字幕av一区中文字幕天堂| 欧美一级成年大片在线观看| 国产精品一久久香蕉国产线看观看| 97在线视频免费播放| 欧美日韩在线视频一区| 大量国产精品视频| 久久精品男人天堂| 精品中文字幕在线2019| 国产精品一区二区三区免费视频| 91国内免费在线视频| 日本19禁啪啪免费观看www| 国外成人在线播放| 红桃av永久久久| 亚洲人a成www在线影院| 日韩欧美国产高清91| 九九精品在线播放| 久久久999精品| 欧美激情欧美激情在线五月| 成人福利视频在线观看| 亚洲高清免费观看高清完整版| 精品视频一区在线视频| 久久久精品久久久久| 国产精品一区二区性色av| 欧美另类在线播放| 亚洲国产日韩精品在线| 国产日韩欧美视频| 国产欧美va欧美va香蕉在| 欧美精品中文字幕一区| 日本精品性网站在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲在线视频福利| 69精品小视频| 91精品国产自产在线| 97久久精品视频| 日韩精品极品毛片系列视频| 亚洲国内高清视频| 色婷婷综合久久久久| 78色国产精品| 国产欧美欧洲在线观看| 日韩欧美中文字幕在线播放| 麻豆一区二区在线观看| 亚洲自拍另类欧美丝袜| 午夜精品久久久99热福利| 国产精品免费观看在线| 日韩电影中文字幕av| 91色精品视频在线| 欧美夫妻性生活xx| 国模私拍一区二区三区| 91性高湖久久久久久久久_久久99| 久久视频在线免费观看| 精品久久久久久久久久久久久| 国产精品亚洲精品| www.国产精品一二区| 中文字幕亚洲欧美在线| 日韩有码在线电影| 久久99热精品这里久久精品| 成人看片人aa| 欧美做受高潮电影o| 欧美精品日韩三级| 国产亚洲精品一区二区| 久久久久北条麻妃免费看| 奇米4444一区二区三区| 欧美国产日韩精品| 成人啪啪免费看| 国产噜噜噜噜久久久久久久久| 色综合视频一区中文字幕| 亚洲第一精品久久忘忧草社区| 欧美午夜精品久久久久久久| 国产精品美女久久久久av超清| 欧美日韩另类在线| 中文字幕欧美日韩在线| 日韩av在线免费播放| 亚洲国产成人精品一区二区| 一区二区欧美在线| 青草青草久热精品视频在线网站| 欧美日韩在线看| 日韩二区三区在线| 在线亚洲国产精品网| 91伊人影院在线播放| 成人精品福利视频| 欧美激情a在线| 国产精品美女久久久久久免费| 国外成人免费在线播放| 欧美激情在线观看| 成人亲热视频网站| 清纯唯美亚洲综合| 国产精品一区二区久久国产| 日韩精品福利在线| 综合欧美国产视频二区| 亚洲国产成人久久综合一区| 亚洲一区中文字幕| 国产成人精品av| 992tv成人免费视频| 亚洲黄在线观看| 亚洲视频在线观看视频| 欧美日韩国产成人在线观看| 欧美成人精品影院| 亚洲国内精品视频| 欧美精品久久久久久久久久| 国产成人久久久精品一区| 国产精品美女午夜av| 国产精品美女免费| 亚洲欧洲在线看| 尤物yw午夜国产精品视频明星| 成人免费视频网| 欧洲成人在线视频| 色老头一区二区三区在线观看| 国产精品白丝jk喷水视频一区| 91精品国产91久久久久久久久| 欧美成人一区二区三区电影| 亚洲永久在线观看| 亚洲欧美日本伦理| 91精品国产综合久久香蕉的用户体验| 久久视频中文字幕| 欧美黑人巨大xxx极品| 亚洲精品xxxx| 亚洲国产成人久久综合一区| 精品久久久久久中文字幕| 久久精品久久久久| 国产精品午夜国产小视频| 日韩毛片中文字幕| 国产精品激情av在线播放| 成人妇女免费播放久久久| 精品国产91久久久久久| 国产精品爽爽爽爽爽爽在线观看| 97超视频免费观看| 亚洲欧美日韩在线一区| 久久久久久久久91| 中文字幕欧美日韩在线| 亚洲欧美999| 色综合久久久久久中文网| 最近2019中文字幕一页二页| 日韩精品有码在线观看| 亚洲在线视频福利| 欧美一区二区.| 亚洲性日韩精品一区二区| 国产精品尤物福利片在线观看| 久久韩剧网电视剧| 97超级碰在线看视频免费在线看| 精品国产一区二区三区久久久狼| 亚洲精品一区久久久久久| 一夜七次郎国产精品亚洲| 午夜精品久久久久久久99热浪潮| 亚洲a在线播放|