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