异步(BeginInvoke,EndInvoke)

it2022-05-05  118

整个异步调用过程中都是围绕IAsyncResult来进行的,,BeginXXX 返回这个对象,EndXXX接收这个对象来结束当前异步对象

public   interface  IAsyncResult{     WaitHandle AsyncWaitHandle {  get ; }  // 阻塞一个线程,直到一个或多个同步对象接收到信号      Boolean IsCompleted {  get ; }  // 判读当前异步是否完成      Object AsyncState {  get ; }  // 获取额外的参数值      Boolean CompletedSynchronously {  get ; }  // 几乎没有使用  }

 

  public   class  AsyncResult : IAsyncResult, IMessageSink {        // IAsyncResult 的实现               public   virtual  WaitHandle AsyncWaitHandle {  get ; }        public   virtual   bool  IsCompleted {  get ; }        public   virtual   object  AsyncState {  get ; }        public   virtual   bool  CompletedSynchronously {  get ; }         //  其他一些重要的属性         public   bool  EndInvokeCalled {  get set ; }  // 检验是否调用了EndInvoke()         public   virtual   object  AsyncDelegate {  get ; }  // 获取原始的委托对象 }

 

 

ar.AsyncWaitHandle.WaitOne() //阻碍当前线程,直到异步调用结束. 

 

namespace  ConsoleApplication15{     class  Program    {         static   void  Main( string [] args)        {            Console.WriteLine( " [(#{1}){0}]:Asynchronous Start " , DateTime.Now.ToString(), Thread.CurrentThread.ManagedThreadId);            AsyncTest test  =   new  AsyncTest();            ConsoleApplication15.AsyncTest.SalaryEventHandler del  =  test.YearlySalary;             // 使用回调函数             AsyncCallback callback  =   new  AsyncCallback(OnSalaryCallback);            IAsyncResult ar  =  del.BeginInvoke( 100000 15 100000 , callback,  2000 );            DoAntherJob();            Console.ReadLine();  //  让黑屏等待,不会直接关闭..         }         // 开始其他工作.          static   void  DoAntherJob()        {            Thread.Sleep( 1000 ); // 需要1秒才能完成这个工作,注1             Console.WriteLine( " [(#{1}){0}]:Do Another Job " , DateTime.Now.ToString(), Thread.CurrentThread.ManagedThreadId);        }         static   void  OnSalaryCallback(IAsyncResult asyncResult)        {             // 通过AsyncState 获取额外的参数.              decimal  para  =  ( int )asyncResult.AsyncState;             // 通过AsyncDelegate 获取原始的委托对象             AsyncResult obj  =  (AsyncResult)asyncResult;            ConsoleApplication15.AsyncTest.SalaryEventHandler del  =  (ConsoleApplication15.AsyncTest.SalaryEventHandler)obj.AsyncDelegate;             if  (asyncResult.IsCompleted) //  判读是否已经调用完成                 Console.WriteLine( " [(#{1}){0}]:Asynchronous Finished. " , DateTime.Now.ToString(), Thread.CurrentThread.ManagedThreadId);             decimal  val  =  del.EndInvoke(asyncResult);            Console.WriteLine( " [(#{2}){0}]:Output Result:{1} " , DateTime.Now.ToString(), val  +  para, Thread.CurrentThread.ManagedThreadId);        }    }     public   class  AsyncTest    {         public   delegate   decimal  SalaryEventHandler( decimal  salary,  int  monthCount,  decimal  bonus);  //  对应YearlySalary方法          public   decimal  YearlySalary( decimal  salary,  int  monthCount,  decimal  bonus)        {             // 模拟耗时/复杂的逻辑计算.             Thread.Sleep( 3000 ); // 等待3秒,注2              return  salary  *  monthCount  +  bonus;        }    }}

 

 

转载于:https://www.cnblogs.com/renjuwht/archive/2010/05/27/1745009.html


最新回复(0)