.NET Framework 为异步操作提供两种设计模式:
使用事件的异步操作。
这里我分别给出一个简单的例子,以供参考。
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异步编程设计模式 。