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

什麼是異步編程?編程

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

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

異步編程實現異步編程

 在C#語言中,經過委託能夠很方便地實現異步編程,在委託類型中定義了兩個方法BeginInvoke()和EndInvoke()spa

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

運行結果:code

從運行結果中,咱們能夠發現主線程在調用了BeginInvoke()方法後,沒有阻塞,而是繼續向下執行,並且任務也確實由一個新的線程來執行,任務執行結束後,調用回調方法,在回調方法中調用EndInvoke()方法來獲取任務執行結果。blog

總結

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

2. C#的委託機制能夠很方便地實現異步編程。it

相關文章
相關標籤/搜索