DotNet异步消息处理

如果想检索消息但不阻碍应用程序的处理,可异步检索消息。在异步消息处理中,启动任务的方法被立即返回而不等待结果。应用程序可以在任务完成过程中继续它原来的工作。任务完成时,服务器可以通知应用程序消息已被成功处理。

有两种类型的异步消息处理操作:异步接收消息和异步查看消息。异步检索消息时,使用 BeginReceive 方法和 EndReceive 方法标记操作的开始和结束。所发生的操作如下所示:
当队列上的消息变得可用时,或者如果要查看或接收的消息已经存在,BeginReceive 方法将立即返回,并引发名为 ReceiveCompleted 的事件。
ReceiveCompleted 事件返回一个 IAsyncResult 类型的对象,该对象包含有关异步操作的信息。
接收到完成的事件后,调用 EndReceive 方法完成操作。在最后的调用中,可以访问消息或通过访问 ReceiveCompletedEventArgs 类检索该消息。

在操作的整个生存期内都可以访问 IAsyncResult 对象,但通常在调用 EndReceive 后才会使用该对象。但是,如果启动多个异步操作,则可将这些操作的 IAsyncResult 值放在数组中,并指定是等待所有操作完成还是任一操作完成。在这种情况下,使用 IAsyncResult 对象的 AsyncWaitHandle 属性标识已完成的操作。

Receive 一样,Peek 使用两个名为 BeginPeekEndPeek 的方法来标记异步操作的开始和结束。当消息可用时,BeginPeek 立即返回,并引发名为 PeekCompleted 的事件。与 ReceiveCompleted 一样,该事件返回一个 IAsyncResult 对象,可以通过使用该对象来获取此操作的有关信息。

另外,异步接收和查看操作均可使用超时时限来指定等待多长时间使消息变得可用。要完成此操作,可以使用任一方法的重载形式来传递一个 TimeSpan 对象,指示等待的时间。如果超时时间到期,但 IAsyncResult 对象上的 IsCompleted 属性设置为 false,指示有消息尚未处理时,将引发 ReceiveCompletedPeekCompleted 事件。

posted @ 2007-08-21 19:28  何益宁  阅读(489)  评论(0编辑  收藏  举报