.NET中的异步操作

时间:2021-10-04 23:51:00

.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异步编程设计模式