C#~非同步程式設計

張佔嶺發表於2014-06-16

返回目錄

.net frameworks5.0主推的就是非同步程式設計APM,它事實上不是新的東西,而是微軟將之前的執行緒等概念的進行的一次封裝,提出了await,async等關鍵字,引用了Task類,也大大簡化了APM的開發,下面我們將通過一個具體的例子來介紹一下APM的使用場合。

例項說明

有一個面向WEB的API介面,在我們專案中需要用到,這個API主要功能是向其它專案發通知,如一個使用者點了回覆帖子,可能伴隨著一個通知的產生,而這個通知可能是PHP端需要體現的,這樣,這種跨網路,跨平臺的介面API就出現了,而在進行通訊過程中,網路是不可控的,它的響應速度是不可預知的,所以,這種通知功能,應該使用我們的非同步程式設計來實現(APM,不是XMLHTTPRequest)。

知識點

非同步方法:提供了一種簡便方式完成可能需要長時間執行的工作,而不必阻止呼叫方的執行緒。 非同步方法的呼叫方可以繼續工作,而不必等待非同步方法完成。

await:運算子應用於一個非同步方法的任務掛起方法的執行,直到等待任務完成。 任務表示正在進行的工作。 await 表示式不阻止它在其上執行的執行緒

async: async 修飾符指示方法、它進行修改 lambda 表示式或 匿名方法 是非同步的

Task類:它表示一個任務,在.net4.5版本開始被支援, 它隸屬於 System.Threading.Tasks名稱空間下;通過Task類可以方便的開啟一個新的執行緒。

程式碼展現

非同步程式碼:

      /// <summary>
        /// 非同步方法,解決長等待問題
        /// </summary>
        /// <param name="action"></param>
        /// <param name="entity"></param>
        /// <returns></returns>
        public async Task AsyncAdd(Func<FAQ_Info, VMessage> fun, FAQ_Info entity)
        {
            return System.Threading.Tasks.Task.Run(() => //解決UI阻塞,這種並不是真正的並行執行,而是開了一個新執行緒非同步執行程式碼段,
                                  //主UI不會等待它返回結果的,如果要與主執行緒合作開發,即並行開發,需要加await來獲取Task的返回結果
{ fun(entity); }); }

呼叫程式碼:

       var repository = new NoticeInfoService();
       repository.AsyncAdd((a) => { return repository.TeacherReplyFAQ(a); }, faqInfo);

使用技巧:使用了Func委託,來統一某種型別的實現,它減少了重複程式碼量。

返回目錄

相關文章