LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

使用C#委托來實現異步編程

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

什么是異步編程?

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

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

異步編程實現

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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
日韩中文字幕波罗野结衣 | 日韩中文字幕欧美亚洲第一区 | 日韩欧美~中文字幕无敌色 亚洲国产欧美一区二区三区深喉 | 日本三级A∨在线观看 | 亚洲国产欧美在线人成| | 亚洲人成影院在线观看网色 |