使用C#委托來實現異步編程
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
什么是異步編程? 異步編程指的就是不用阻塞當前線程來等待任務的完成,而是將任務扔到線程池中去執行,當前線程可以繼續向下執行,直至其它線程將任務完成,并回調通知當前線程。 整個任務從開始到結束都是異步完成的,不會阻塞當前線程。因此,異步編程很重要的一點就是,不會阻塞當前線程。 異步編程實現 在C#語言中,通過委托可以很方便地實現異步編程,在委托類型中定義了兩個方法BeginInvoke()和EndInvoke() ///<summary> ///開始執行異步操作 ///</summary> ///<param name="param">委托方法的參數</param> ///<param
name="callback"></param> ///<param
name="object"></param> ///<returns></returns> IAsyncResult BeginInvoke(int
param,AsyncCallback callback,Object @object); ///<summary> ///結束執行異步操作,并且返回異步操作結果 ///</summary> ///<returns>委托方法的返回類型</returns>
string EndInvoke(IAsyncResult result); 下面就通過一段代碼來具體實現異步編程: ///<summary> ///定義一個委托類型 ///</summary> public delegate int AddDel(int x,int
y); ///<summary> ///任務類 ///</summary> public class TaskClass { //計算任務 public static int AddTask(int x,int
y) {
Console.WriteLine("異步線程(ThreadId={0})開始執行計算任務.\n",Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("異步線程(ThreadId={0})計算中...\n",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000);
int result=x+y;
Console.WriteLine("異步線程(ThreadId={0})結束執行計算任務.\n",Thread.CurrentThread.ManagedThreadId);
return result; } } ///<summary> ///實現異步編程,主線程不會阻塞 ///</summary> public class AsynCallbackClass { public static int result; public static void Main(string[]
args) {
Console.WriteLine("主線程(ThreadId={0})開始執行.\n",Thread.CurrentThread.ManagedThreadId);
AddDel addDel=new AddDel(TaskClass.AddTask);
int x=123457,y=48759;
Console.WriteLine("主線程(ThreadId={0})調用BeginInvoke()方法開始執行異步操作.\n",
Thread.CurrentThread.ManagedThreadId);
//開始執行異步操作,Callback為定義的回調方法 addDel.BeginInvoke(x,y,Callback,null);
Console.WriteLine("主線程(ThreadId={0})繼續執行...\n",Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000); //輸出計算任務返回的結果
Console.WriteLine("計算結果:{0}+{1}={2}.\n",x,y,result);
Console.WriteLine("主線程(ThreadId={0})執行結束.\n",Thread.CurrentThread.ManagedThreadId); } ///<summary>
///回調方法
///</summary>
///<param
name="ar"></param>
public static void Callback(IAsyncResult ar)
{ AsyncResult asyncResult=ar as
AsyncResult;
if(asyncResult ==null){ return;}
AddDel addDel=asyncResult.AsyncDelegate as
AddDel;
if(addDel==null){return;}
Console.WriteLine("回調方法中調用EndInvoke()方法結束執行異步操作,獲取計算任務結果.\n",Thread.CurrentThread.ManagedThreadId); //結束執行異步操作,并返回計算任務結果 result=addDel.EndInvoke(ar); }
} 運行結果: 從運行結果中,我們可以發現主線程在調用了BeginInvoke()方法后,沒有阻塞,而是繼續向下執行,而且任務也確實由一個新的線程來執行,任務執行結束后,調用回調方法,在回調方法中調用EndInvoke()方法來獲取任務執行結果。 總結1. 在異步編程中,當前線程是不會被阻塞的。 2. C#的委托機制可以很方便地實現異步編程。 該文章在 2021/3/3 16:48:44 編輯過 |
關鍵字查詢
相關文章
正在查詢... |