亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

使用C#委托來實現(xiàn)異步編程

admin
2021年3月3日 16:48 本文熱度 3686

什么是異步編程?

異步編程指的就是不用阻塞當前線程來等待任務的完成,而是將任務扔到線程池中去執(zhí)行,當前線程可以繼續(xù)向下執(zhí)行,直至其它線程將任務完成,并回調(diào)通知當前線程。

整個任務從開始到結(jié)束都是異步完成的,不會阻塞當前線程。因此,異步編程很重要的一點就是,不會阻塞當前線程。

異步編程實現(xiàn)

 在C#語言中,通過委托可以很方便地實現(xiàn)異步編程,在委托類型中定義了兩個方法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);


下面就通過一段代碼來具體實現(xiàn)異步編程:

///<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})開始執(zhí)行計算任務.\n",Thread.CurrentThread.ManagedThreadId);

         Console.WriteLine("異步線程(ThreadId={0})計算中...\n",Thread.CurrentThread.ManagedThreadId);

          Thread.Sleep(3000);

           int result=x+y;

           Console.WriteLine("異步線程(ThreadId={0})結(jié)束執(zhí)行計算任務.\n",Thread.CurrentThread.ManagedThreadId);

            return result;

}

}

///<summary>

///實現(xiàn)異步編程,主線程不會阻塞

///</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);

//輸出計算任務返回的結(jié)果

         Console.WriteLine("計算結(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í)行異步操作,獲取計算任務結(jié)果.\n",Thread.CurrentThread.ManagedThreadId);

 //結(jié)束執(zhí)行異步操作,并返回計算任務結(jié)果

result=addDel.EndInvoke(ar);

}

}


運行結(jié)果:


從運行結(jié)果中,我們可以發(fā)現(xiàn)主線程在調(diào)用了BeginInvoke()方法后,沒有阻塞,而是繼續(xù)向下執(zhí)行,而且任務也確實由一個新的線程來執(zhí)行,任務執(zhí)行結(jié)束后,調(diào)用回調(diào)方法,在回調(diào)方法中調(diào)用EndInvoke()方法來獲取任務執(zhí)行結(jié)果。

總結(jié)

1. 在異步編程中,當前線程是不會被阻塞的。

2. C#的委托機制可以很方便地實現(xiàn)異步編程。


該文章在 2021/3/3 16:48:44 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關(guān)報表等業(yè)務管理,結(jié)合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved