`
lanfei
  • 浏览: 154664 次
  • 性别: 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();
        }
    }
}

 

分享到:
评论

相关推荐

    C#同步异步操作说明

    总结来说,C#的同步和异步操作在处理耗时任务时扮演着不同的角色。同步操作简单但可能导致阻塞,而异步操作则提高了程序的并发性和响应性,但需要更复杂的编程模式和管理。理解并熟练运用这两种方法对于编写高性能的...

    .Net的异步机制(委托Delegate)

    在C#中,委托是一种类型安全的事件处理机制,它可以被看作是指向方法的指针。在异步编程中,委托允许我们使用BeginInvoke和EndInvoke方法启动异步调用。下面我们将深入探讨这两个方法以及如何使用委托实现异步操作。...

    深入分析C#异步编程详解

    C#异步编程是.NET Framework提供的一种机制,允许开发者在应用程序中实现非阻塞操作,提高程序的响应性和效率。本文将深入探讨异步编程的核心概念、方法以及使用技巧。 同步方法和异步方法的区别在于执行流程。同步...

    C#反射学习文档

    ### C#反射学习文档:深入理解同步与异步方法调用 #### 概述 本文档旨在介绍C#中同步与异步方法调用的基本概念及其应用方式,这对于理解和掌握.NET框架下的多线程编程非常关键。同步和异步方法的选择直接影响到...

    委托异步调用

    总结,委托异步调用是C#中实现非阻塞操作的重要手段,它将函数指针的概念与异步编程相结合,提供了灵活、高效的方法来处理复杂的并发问题。理解并熟练掌握这一技术对于开发高性能的.NET应用程序至关重要。

    rabbitmqredis:Rabbitmqüzerinde关联ID库拉纳拉克语asenkron编程语言

    // 异步处理任务,例如使用Redis操作 Task.Run(() =&gt; ProcessTask(message)); }; channel.BasicConsume(queue: "task_queue", autoAck: true, consumer: consumer); ``` 通过以上内容,我们可以看到如何在...

Global site tag (gtag.js) - Google Analytics