C#中怎么實(shí)現(xiàn)異步調(diào)用,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比青縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式青縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋青縣地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。
首先,C#異步調(diào)用出來的新線程,必須回收,不回收是浪費(fèi)資源的可恥行為,.NET也是不允許的,所以你別想鉆空子,俗話說,請神容易送神難,就是這個道理。下面你可以很容易想到,回收分為2種情況:主動回收和被動回收(當(dāng)然,這是我自己的理解,微軟可不是這么說的),主動回收就是,你去監(jiān)視那個線程,并且等待,當(dāng)C#異步調(diào)用方法完成了,就把C#異步調(diào)用線程回收,焦點(diǎn)回歸主線程,實(shí)際上就是上篇文章《C#C#異步調(diào)用初步》的那種情況,BeginInvoke之后又EndInvoke,如果在EndInvoke的時候,該C#異步調(diào)用線程沒有完成操作,那么整個程序,包括主線程,又在阻塞了,又會出現(xiàn)界面“死”的情況。要想解決這個問題,就使用“被動回收”方式,其中一個重要的辦法就是“C#異步調(diào)用回調(diào)”。
C#異步調(diào)用核心有二:
A、 用回調(diào)函數(shù)(本例中為CallBackMethod),C#異步調(diào)用結(jié)束后,自動調(diào)用此回調(diào)函數(shù)。
B、 而不在主線程中手工等待C#異步調(diào)用結(jié)束,如上兩例中在主線程中調(diào)用EndInvoke。此種方法,是在回調(diào)函數(shù)中調(diào)用EndInvoke的。
C#異步調(diào)用回調(diào)的大概流程是這樣的:首先啟動C#異步調(diào)用,啟動參數(shù)加上C#異步調(diào)用結(jié)束時執(zhí)行的方法,然后這個C#異步調(diào)用線程就不用管了,***當(dāng)這個C#異步調(diào)用線程自己完成工作了,就自動執(zhí)行啟動參數(shù)里的那個方法,這樣確實(shí)很省心,可是代碼寫起來,就很復(fù)雜了。
下面是搜藏的代碼:
//首先準(zhǔn)備好,要進(jìn)行C#異步調(diào)用的方法(能C#異步調(diào)用的,***不多線程) private string MethodName(int Num, out int Num2) { Num2 = Num; return "HelloWorld"; } //程序終點(diǎn) //C#異步調(diào)用完成時,執(zhí)行的方法(回調(diào)方法), //此方法只能有IAsyncResult一個參數(shù),但是該參數(shù)幾乎***,可以傳遞object private void CallBackMethod(IAsyncResult ar) { //從C#異步調(diào)用狀態(tài)ar.AsyncState中,獲取委托對象 DelegateName dn = (DelegateName)ar.AsyncState; //輸出參數(shù) int i; //一定要EndInvoke,否則你的下場很慘 string r = dn.EndInvoke(out i, ar); MessageBox.Show("C#異步調(diào)用完成嘍!i的值是" i.ToString() ",r的值是" r); } //定義與方法同簽名的委托 private delegate string DelegateName(int Num, out int Num2); //程序入口 private void Run() { //實(shí)例化委托并初賦值 DelegateName dn = new DelegateName(MethodName); //輸出參數(shù) int i; //實(shí)例化回調(diào)方法 //把AsyncCallback看成Delegate你就懂了, //實(shí)際上AsyncCallback是一種特殊的Delegate,就像Event似的 AsyncCallback acb = new AsyncCallback(CallBackMethod); //C#異步調(diào)用開始 //如果參數(shù)acb換成null則表示沒有回調(diào)方法 //***一個參數(shù)dn的地方,可以換成任意對象, //該對象可以被回調(diào)方法從參數(shù)中獲取出來,寫成null也可以。 //參數(shù)dn相當(dāng)于該線程的ID,如果有多個C#異步調(diào)用線程, //可以都是null,但是絕對不能一樣,不能是同一個object,否則異常 IAsyncResult iar = dn.BeginInvoke(1, out i, acb, dn); //去做別的事 //………… } //***的結(jié)果應(yīng)該是:i=1,r="HelloWorld"
另外,如果可以,定義委托的時候可以選擇不用過多的修飾:
/// ﹤summary﹥ /// 定義委托 /// ﹤/summary﹥ /// ﹤returns﹥﹤/returns﹥ public delegate bool Asyncdelegate(); /// ﹤summary﹥ /// Callback method must have the same signature as the /// AsyncCallback delegate /// ﹤/summary﹥ /// ﹤param name="ar"﹥﹤/param﹥ private void CallbackMethod(IAsyncResult ar) { // Retrieve the delegate. Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState; // Call EndInvoke to retrieve the results. dlgt.EndInvoke(ar); }
其他方法中調(diào)用:
//C#異步調(diào)用執(zhí)行 //指定委托方法 Asyncdelegate isgt = new Asyncdelegate(icpInfo.Insert); IAsyncResult ar = isgt.BeginInvoke( new AsyncCallback(CallbackMethod), isgt);
關(guān)于C#中怎么實(shí)現(xiàn)異步調(diào)用問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)站名稱:C#中怎么實(shí)現(xiàn)異步調(diào)用
新聞來源:http://aaarwkj.com/article36/ipcosg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、微信公眾號、建站公司、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)