程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> C#異步調用的好處和方法分享

C#異步調用的好處和方法分享

編輯:更多關於編程

    程包括界面就不會死掉了。異步如何開始,好理解,現在我們討論的是如何結束這個異步出來的新線程。 
    首先,異步出來的新線程,必須回收,不回收是浪費資源的可恥行為,.NET也是不允許的,所以你別想鑽空子,俗話說,請神容易送神難,就是這個道理。下面你可以很容易想到,回收分為2種情況:主動回收和被動回收(當然,這是我自己的理解,微軟可不是這麼說的),主動回收就是,你去監視那個線程,並且等待,當異步方法完成了,就把異步線程回收,焦點回歸主線程,實際上就是上篇文章《C#異步初步》的那種情況,BeginInvoke之後又EndInvoke,如果在EndInvoke的時候,該異步線程沒有完成操作,那麼整個程序,包括主線程,又在阻塞了,又會出現界面“死”的情況。要想解決這個問題,就使用“被動回收”方式,其中一個重要的辦法就是“異步回調”。 核心有二: A、 用回調函數(本例中為CallBackMethod),異步結束後,自動調用此回調函數。 B、 而不在主線程中手工等待異步結束,如上兩例中在主線程中調用EndInvoke。此種方法,是在回調函數中調用EndInvoke的。 異步回調的大概流程是這樣的:首先啟動異步,啟動參數加上異步結束時執行的方法,然後這個異步線程就不用管了,最後當這個異步線程自己完成工作了,就自動執行啟動參數裡的那個方法,這樣確實很省心,可是代碼寫起來,就很復雜了。 下面是搜藏的代碼: 
    復制代碼代碼如下:
    //首先准備好,要進行異步的方法(能異步的,最好不多線程) 
    privatestringMethodName(intNum,outintNum2) 

    Num2=Num; 
    return"HelloWorld"; 

    //程序終點 
    //異步完成時,執行的方法(回調方法),此方法只能有IAsyncResult一個參數,但是該參數幾乎萬能,可以傳遞object 
    privatevoidCallBackMethod(IAsyncResultar) 

    //從異步狀態ar.AsyncState中,獲取委托對象 
    DelegateNamedn=(DelegateName)ar.AsyncState; 
    //輸出參數 
    inti; 
    //一定要EndInvoke,否則你的下場很慘 
    stringr=dn.EndInvoke(outi,ar); 
    MessageBox.Show("異步完成喽!i的值是"i.ToString()",r的值是"r); 

    //定義與方法同簽名的委托 
    privatedelegatestringDelegateName(intNum,outintNum2); 
    //程序入口 
    privatevoidRun() 

    //實例化委托並初賦值 
    DelegateNamedn=newDelegateName(MethodName); 
    //輸出參數 
    inti; 
    //實例化回調方法 
    //把AsyncCallback看成Delegate你就懂了,實際上AsyncCallback是一種特殊的Delegate,就像Event似的 
    AsyncCallbackacb=newAsyncCallback(CallBackMethod); 
    //異步開始 
    //如果參數acb換成null則表示沒有回調方法 
    //最後一個參數dn的地方,可以換成任意對象,該對象可以被回調方法從參數中獲取出來,寫成null也可以。參數dn相當於該線程的ID,如果有多個異步線程,可以都是null,但是絕對不能一樣,不能是同一個object,否則異常 
    IAsyncResultiar=dn.BeginInvoke(1,outi,acb,dn); 
    //去做別的事 
    //………… 

    //最後的結果應該是:i=1,r="HelloWorld" 
    //另外,如果可以,定義委托的時候可以選擇不用過多的修飾: 
    ///<summary> 
    ///定義委托 
    ///</summary> 
    ///<returns></returns> 
    publicdelegateboolAsyncdelegate(); 
    ///<summary> 
    ///Callbackmethodmusthavethesamesignatureasthe 
    ///AsyncCallbackdelegate 
    ///</summary> 
    ///<paramname="ar"></param> 
    privatevoidCallbackMethod(IAsyncResultar) 

    //Retrievethedelegate. 
    Asyncdelegatedlgt=(Asyncdelegate)ar.AsyncState; 
    //CallEndInvoketoretrievetheresults. 
    dlgt.EndInvoke(ar); 

    //其他方法中調用: 
    //異步執行 
    //指定委托方法 
    Asyncdelegateisgt=newAsyncdelegate(icpInfo.Insert); 
    IAsyncResultar=isgt.BeginInvoke(newAsyncCallback(CallbackMethod),isgt);

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved