萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 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); 
//異步

copyright © 萬盛學電腦網 all rights reserved