整个异步调用过程中都是围绕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
