• .NET中的异步操作


    .NET Framework 为异步操作提供两种设计模式:

    1. 使用 IAsyncResult 对象的异步操作。
    2. 使用事件的异步操作。

    这里我分别给出一个简单的例子,以供参考。

    1。使用 IAsyncResult 对象的异步操作。

    using System;
    using System.Collections.Generic;
    using System.Text;

    using System.Threading;


    namespace ConsoleApplication1
    {

        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(DateTime.Now);
                AsyncOpTest op = new AsyncOpTest();
                GetTimeHandler handler = op.DelayGetTime;
                handler.BeginInvoke(6, GetTimeCallBack, handler);
                Console.WriteLine("function return");

                Thread.Sleep(-1); //
    等待异步操作结束

            }

            static void GetTimeCallBack(IAsyncResult ar)
            {
                GetTimeHandler handler = ar.AsyncState as GetTimeHandler;
                DateTime time = handler.EndInvoke(ar); //
    获取时间

                Console.WriteLine(time);
                Console.WriteLine("function end");
            }
        }

        delegate DateTime GetTimeHandler(int seconds);
        class AsyncOpTest
        {
            public DateTime DelayGetTime(int seconds) //
    使用同步方式获取时间
            {
                Thread.Sleep(seconds * 1000);
                return DateTime.Now;
            }
        }
    }

    2。使用事件的异步操作。

    using System;
    using System.Collections.Generic;
    using System.Text;

    using System.Threading;


    namespace ConsoleApplication1
    {

        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(DateTime.Now);
                AsyncOpTest op = new AsyncOpTest();
                op.GetTimeCompleted += GetTimeCompleted;
                op.DelayGetTimeAsync(6);
                Console.WriteLine("function return");

                Thread.Sleep(-1); //
    等待异步操作结束

            }

            static void GetTimeCompleted(object sender, GetTimeCompletedEventArgs e)
            {
                Console.WriteLine(e.Time);
                Console.WriteLine("function end");
            }
        }

        class GetTimeCompletedEventArgs : EventArgs
        {
            public GetTimeCompletedEventArgs(DateTime time)
            {
                this.time = time;
            }

            private DateTime time;
            public DateTime Time
            {
                get { return time; }
            }

        }
        class AsyncOpTest
        {
            public event EventHandler<GetTimeCompletedEventArgs> GetTimeCompleted;

            public DateTime DelayGetTime(int seconds) //
    使用同步方式获取时间
            {
                Thread.Sleep(seconds * 1000);
                return DateTime.Now;
            }

            delegate DateTime GetTimeHandler(int seconds);
            public void DelayGetTimeAsync(int seconds) //
    使用异步方式延迟获取时间
            {
                GetTimeHandler calu = DelayGetTime;
                calu.BeginInvoke(seconds, CaluCallBack, calu);
            }

            void CaluCallBack(IAsyncResult ar)
            {
                GetTimeHandler calu = ar.AsyncState as GetTimeHandler;
                DateTime time = calu.EndInvoke(ar); //
    获取函数返回值
                if (GetTimeCompleted != null)
                {
                    GetTimeCompleted(this, new GetTimeCompletedEventArgs(time));
                }
            }
        }
    }

    当然,这个程序不是很完善,需要解决的问题还很多(如多线程并发访问等)。但也能基本的演示基于事件的异步操作的实现过程。

    3。小结

    比较而言,通过 IAsyncResult 对象实现异步操作相对简单,并且功能强大,但使用控制起来相对较麻烦,代码不是很优雅,使用者需要对IasyncResult的使用方式有一定的了解。使用事件的异步操作相对简单得多,基本上看到API的声明就能用,而实现起来相对较为复杂,并且功能有限。

    更多相关内容,请参看msdn异步编程设计模式

  • 相关阅读:
    一个界面描述标签的想法
    使用MyGeneration创建模板:介绍(翻译)
    ICE:C#和Java共同的服务器
    Spring.NET 快速入门 (翻译)
    TSQL命令在SQLServer查询中的运用
    SQL数据库修复
    区分汉字和字母的函数
    如何生成静态页
    delphi 开发扩展(一)
    20072008
  • 原文地址:https://www.cnblogs.com/TianFang/p/616057.html
Copyright © 2020-2023  润新知