异步(BeginInvoke,EndInvoke)

整个异步调用过程中都是围绕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 { getset; } //检验是否调用了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(10000015100000, 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;
        }
    }
}

 

 

posted @ 2010-05-27 10:21  小白.net  阅读(3249)  评论(0编辑  收藏  举报