翻譯|使用教程|編輯:王香|2018-10-18 09:47:54.000|閱讀 288 次
概述:本文介紹C#中的異步編程(下),介紹了基于事件的異步模式和基于任務(wù)的異步模式(TAP)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
【下載FastReport.Net最新版本】
異步編程模型出現(xiàn)在.Net Framework的第一個(gè)版本中。APM允許使用兩種方法創(chuàng)建同步方法的異步版本 - Begin 和End 。 所以,只有兩種方法:
public IAsyncResult Begin{MethodName}(TIn[] args, AsyncCallback callback, object userState =null) { … }
和:
public TResult End{MethodName}(IAsyncResult result) { ... }
Begin {MethodName}方法啟動(dòng)異步操作。它接受參數(shù)args,callback--執(zhí)行異步方法后調(diào)用的方法的委托,userState對(duì)象,用于將有關(guān)特定應(yīng)用程序狀態(tài)的信息傳遞給異步操作結(jié)束時(shí)調(diào)用的方法。 該方法返回IAsyncResult類型的對(duì)象,該對(duì)象存儲(chǔ)有關(guān)異步操作的信息。 End {MethodName}方法終止異步操作。它接受一個(gè)輸入對(duì)象,類型為IAsyncResult,并返回TResult,它實(shí)際上返回此方法的同步副本中定義的類型。 讓我們看一下簡(jiǎn)化示例中如何使用此模板:
public void Button_Click (...) { WebRequest request = WebRequest.Create(url); request.BeginGetResponse(Callback , request); } public void Callback(IAsyncResult ar) { WebRequest request = (WebRequest) ar.AsyncState; try { var response = request.EndGetResponse(ar); // Code does something with successful response } catch (WebException e) { // Error handling code } }
我們?cè)诎粹o單擊事件處理程序中調(diào)用了Begin方法。作為參數(shù),我們將回調(diào)傳遞給此方法。并且,已經(jīng)在回調(diào)本身中我們稱為對(duì)方法 - 結(jié)束。 異步編程模型的缺點(diǎn)包括:
這種異步編程模式出現(xiàn)在.Net框架的第二個(gè)版本中。它基于事件和異步方法。實(shí)現(xiàn)此模板的類將包含方法MethodNameAsync和MethodNameAsyncCancel(如果需要操作取消處理)和MethodNameCompleted事件。在同一個(gè)類中,您可以放置??使用相同線程的方法的同步版本。大多數(shù)情況下,在使用Web服務(wù)時(shí)會(huì)使用此模板。例如,ajax實(shí)現(xiàn)基于事件的異步模式。您只能在MethodNameCompleted事件處理程序中獲取異步操作的結(jié)果并處理錯(cuò)誤。
基于事件的異步編程模式解決了前一個(gè)問(wèn)題:
但是,此模板仍有許多缺點(diǎn):
異步編程的第三個(gè)模板出現(xiàn)在.Net Framework 4.0中。從標(biāo)題中可以清楚地看出它基于任務(wù)的使用。TAP的基礎(chǔ)是System.Threading.Tasks.Task和System.Threading.Tasks.Task 兩種類型。
TAP允許開發(fā)人員在單個(gè)方法中定義異步函數(shù)。現(xiàn)在不需要?jiǎng)?chuàng)建異步操作的開始和結(jié)束的函數(shù),然后還有回調(diào)函數(shù)。這當(dāng)然有利于程序員的工作,降低了進(jìn)入技術(shù)的門檻,并簡(jiǎn)單地使編程變得愉快。 TAP使用任務(wù)來(lái)執(zhí)行操作。對(duì)于每個(gè)任務(wù),使用一個(gè)單獨(dú)的線程,該線程取自線程池。任務(wù)完成后,線程返回池。
修飾符“async” - 此修飾符應(yīng)用于方法或lambda表達(dá)式或匿名方法 - 它表示該方法是異步的,并表示此方法中出現(xiàn)一次或多次wait語(yǔ)句的可能性。 我們來(lái)看一個(gè)方法定義的例子:
public async Task<int>MyProcessAsync() { … Var Overtime = await new ERP().ProcessOvertime(emp); … }
注意關(guān)鍵字async和await。這些是表示正在使用基于任務(wù)的異步模式的運(yùn)算符。async修飾符表示該方法是異步的。并且可以在方法內(nèi)調(diào)用await語(yǔ)句一次或多次。它暫停執(zhí)行任務(wù),直到獲得結(jié)果,同時(shí)線程繼續(xù)工作。
這是一個(gè)從生活中使用TAP的例子。調(diào)用Web服務(wù):
static async Task<string> SendMessageAsync() { var client = new MyServiceClient(); var task = Task.Factory.StartNew(() => client.SendMessageAsync("Message")); var result = await task; return result; }
這是另一種調(diào)用方式,更簡(jiǎn)單,更容易理解:
static async Task<string> SendMessageAsyncNew() { var client = new MyServiceClient(); var result = await client.SendMessageAsync("Message"); return result; }
使用await的這個(gè)“輕量級(jí)”版本可以在.Net Framework 4.5中找到。 基于異步任務(wù)的方法解決了以前模板的大多數(shù)問(wèn)題。然后你和中斷異步操作的能力,以及一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法,跟蹤操作進(jìn)度的能力。 目前,Microsoft建議在開發(fā)組件時(shí)使用此模板實(shí)現(xiàn)異步調(diào)用。 至于使用這個(gè)模板的權(quán)宜之計(jì)。使用TAP將增加服務(wù)器的帶寬。但是,如果您有少量流量(例如,客戶端 - 服務(wù)器),則創(chuàng)建異步流程的成本可能會(huì)抵消收益。在這種情況下,同步方法將更快地工作。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn