`
lanfei
  • 浏览: 150500 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C# AsyncEventHandler 异步处理

    博客分类:
  • C#
 
阅读更多
using System;

namespace ConsoleApplication1
{
    class Class1
    {
        public delegate void AsyncEventHandler();

        void Event1()
        {
            Console.WriteLine("Event1 Start");
            System.Threading.Thread.Sleep(2000);
            Console.WriteLine("Event1 End");
        }

        void Event2()
        {
            Console.WriteLine("Event2 Start");
            int i=1;
            while(i<500)
            {
                i=i+1;
              //  Console.WriteLine("Event2 "+i.ToString());
            }
            Console.WriteLine("Event2 End");
        }

        void CallbackMethod(IAsyncResult ar)
        {
            ((AsyncEventHandler) ar.AsyncState).EndInvoke(ar);
        }


        [STAThread]
        static void Main(string[] args)
        {
            long start=0;
            long end=0;
            Class1 c = new Class1();
            Console.WriteLine("ready");
            start=DateTime.Now.Ticks;

            /***   同步 ****/
            c.Event1();
            c.Event2();

            end = DateTime.Now.Ticks;
            Console.WriteLine(" 同步  时间刻度差=" + Convert.ToString(end - start));


            /***   异步1 ****/ 
            start = DateTime.Now.Ticks;
            AsyncEventHandler asy = new AsyncEventHandler(c.Event1);
            IAsyncResult ia = asy.BeginInvoke(null, null);
            c.Event2();
            asy.EndInvoke(ia);
            end = DateTime.Now.Ticks;
            Console.WriteLine(" 异步1 时间刻度差=" + Convert.ToString(end - start));

           
            /***   异步2 ****/
            start = DateTime.Now.Ticks;
            AsyncEventHandler asy2 = new AsyncEventHandler(c.Event1);
            IAsyncResult ia2 = asy2.BeginInvoke(null, null);
            c.Event2();
            while (!ia2.IsCompleted) //IAsyncResult.IsCompleted属性获取异步操作是否已完成的指示,发现异步调用何时完成.
            {
            }
            asy2.EndInvoke(ia2);

            end = DateTime.Now.Ticks;
            Console.WriteLine(" 异步2 时间刻度差=" + Convert.ToString(end - start));

            /***   异步3 ****/
            /***   
             * IAsyncResult.AsyncWaitHandle属性获取用于等待异步操作完成的WaitHandle
             * WaitHandle.WaitOne方法阻塞当前线程,直到当前的WaitHandle收到信号
             * 使用WaitHandle,则在异步调用完成之后,但在通过调用EndInvoke结果之前,可以执行其他处理 
            ***/
            start = DateTime.Now.Ticks;
            AsyncEventHandler asy3 = new AsyncEventHandler(c.Event1);
            IAsyncResult ia3 = asy3.BeginInvoke(null, null);
            c.Event2();
            ia3.AsyncWaitHandle.WaitOne(); 

            end = DateTime.Now.Ticks;
            Console.WriteLine(" 异步3 时间刻度差=" + Convert.ToString(end - start));

            /***   异步4 ****/
            /***   
             * 如果启动异步调用的线程不需要处理调用结果,则可以在调用完成时执行回调方法
             * 要使用回调方法,必须将代表该方法的AsyncCallback委托传递给BeginInvoke 
            ***/
            start = DateTime.Now.Ticks;
            AsyncEventHandler asy4 = new AsyncEventHandler(c.Event1);
            asy4.BeginInvoke(new AsyncCallback(c.CallbackMethod), asy4);
            c.Event2();

            end =DateTime.Now.Ticks;
            Console.WriteLine(" 异步4 时间刻度差=" + Convert.ToString(end - start));
            Console.ReadLine();
        }
    }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics