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