`
lanfei
  • 浏览: 153584 次
  • 性别: 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#异步操作 异步查询数据库 异步处理一行一行加载数据

    使用`try-catch`块可以捕获并处理异步操作中可能抛出的异常。同时,考虑使用`TaskCanceledException`来处理用户取消操作的情况。 最后,优化异步代码时,应避免过度使用`await`。如果一个方法中大部分时间都在等待...

    C#异步数据接收串口操作

    C#作为.NET框架的主要编程语言,虽然原生支持异步编程模型,但在处理串口通信时,往往需要借助于Win32 API来实现更底层的控制。本篇文章将深入探讨如何在C#中进行异步数据接收,通过串口操作发送和接收AT指令,并以...

    C#实现异步调用外部程序

    在C#编程中,异步调用外部程序是一种常见的需求,尤其在处理耗时操作或者不希望阻塞主线程执行的情况下。本篇文章将深入探讨如何使用C#来实现这一功能,以及相关的知识点。 首先,我们需要了解异步编程的基本概念。...

    c# 串口类 纯异步接收

    "c# 串口类 纯异步接收"是一个关于如何利用C#语言的`System.IO.Ports.SerialPort`类进行纯异步数据接收的专题。这个标题暗示了我们将在程序设计中不使用同步阻塞的方式,而是借助事件驱动和回调函数来处理串口数据的...

    c#UDP异步发送接收

    本文将深入探讨C#中如何实现UDP的异步发送和接收,这对于构建实时、低延迟的网络应用尤其重要。 UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序或完整性,但具有较低的开销,适合实时视频、音频流传输...

    C# WINFORM 异步 弹出请稍等提示

    在C# WinForm开发中,异步编程是一个重要的技术,特别是在处理大数据量或者长时间运行的任务时,为了保证用户界面的响应性,我们通常会采用非阻塞的方式执行这些任务。"C# WINFORM 异步 弹出请稍等提示"这个主题就...

    c# winform异步不卡界面的实现方法

    C# WinForm异步不卡界面的实现方法 在WinForm开发中,避免界面卡死是非常重要的一点。界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作。这篇文章将为您介绍如何使用异步编程来...

    C# TCP异步收发信息 多线程

    C#语言,运用TCP异步收发信息。客户端只要知道服务器端IP和端口号,就可以和服务器建立连接,异步收发信息。本实例包括服务器端和客户端程序,并且有很详细的注释,希望大家看后能有一定的收获。

    c#Winform异步线程刷新UI

    VS2013支持.net框架4.0,该版本引入了Task类和异步编程模型,使得处理这种需求变得更加便捷。本文将详细探讨如何在WinForm应用中使用异步线程来刷新UI,并实时反馈任务进度。 首先,让我们了解什么是异步编程。异步...

    c#进度条异步显示.rar

    在C#编程中,异步处理是提升用户体验的关键技术之一,特别是在进行大型数据计算、平差、分析、建模和预测等耗时操作时。"c#进度条异步显示.rar"这个压缩包文件可能包含了一个示例项目,用于演示如何在C#中实现一个不...

    C#实现异步拷贝多个文件

    在C#编程中,异步操作是现代应用开发的关键特性,尤其在处理大量I/O密集型任务时,如文件拷贝。异步编程允许程序在等待长时间运行的操作完成时,继续执行其他任务,从而提高应用程序的响应性和效率。本主题将深入...

    C#实现异步连接Sql Server数据库的方法

    总的来说,C#的`async`和`await`关键字提供了一种优雅的方式来实现与SQL Server数据库的异步连接,这对于处理I/O密集型操作,如数据库交互,是非常理想的。通过这种方式,开发者可以编写出更加流畅、高效的代码,...

    c#socket异步及断线重连

    c#socket异步编程及断线重连。并怎样实现循环接受服务器的命令并处理。

    C#socket异步通信模板

    C#中,Socket类提供了多个异步方法,如`BeginConnect`、`BeginSend`、`BeginReceive`等,这些方法通过回调函数处理完成后的操作。 3. **C# Winform结合Socket**: 在Windows Forms环境下,我们通常会创建一个UI...

    C# 同步与异步读写

    本篇文章将深入探讨C#中的同步与异步读写,并结合“第一次实验(同步与异步读写)”的实践案例进行解析。 首先,我们要理解同步和异步的基本概念。同步操作意味着代码执行是线性的,一个任务必须等待另一个任务完成...

    c# webform 异步加载用户控件

    4. **服务器端处理**:在服务器端,处理异步请求的方法接收到请求后,实例化用户控件,执行必要的逻辑,然后将控件的HTML输出返回给客户端。 5. **更新DOM**:在客户端,收到服务器返回的HTML后,使用jQuery的.html...

    C# 异步刷新控件

    在C# Windows Forms桌面应用程序开发中,异步刷新控件是一项关键的技术,它能提高程序的响应速度,尤其是在处理大量数据或执行长时间操作时。本主题将深入探讨如何异步刷新TextBox和DataGridView控件,以避免阻塞UI...

    C#中定时器的是使用及异步委托

    这里我们将深入探讨C#中的定时器使用,特别是`System.Timers.Timer`和`System.Windows.Forms.Timer`,以及如何结合异步委托(如`BeginInvoke`)来实现非阻塞的异步调用。 首先,`System.Timers.Timer`通常用于...

    C#实现异步的进度条操作

    在C#编程中,异步进度条操作是一个关键的用户界面(UI)更新技术,它允许在后台执行耗时操作的同时,保持用户界面的响应和更新进度信息。本主题将深入探讨如何使用C#实现这样的功能,特别是涉及`BackgroundWorker`...

    C# socket异步长连接

    在IT行业中,网络编程是至关重要的一个领域,而C#作为一种强大的编程语言,提供了丰富的工具和技术来处理网络通信。本文将深入探讨"C# socket异步长连接"这一主题,包括其概念、工作原理以及如何在实际开发中实现。 ...

Global site tag (gtag.js) - Google Analytics