异步消息处理

更新:2007 年 11 月

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

有两种类型的异步消息处理操作:异步接收消息和异步查看消息。异步检索消息时,使用 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 事件。

有关异步处理的更多信息,请参见以下页:

有关信息

请参见

异步接收消息的逐步骤说明

如何:异步接收消息

BeginPeek 方法及其成员的概述

BeginPeek

BeginReceive 方法及其成员的概述

BeginReceive

接收异步操作的通知

当异步接收或异步查看操作成功完成时,可用两种方法接收通知:

  • 可以创建一个事件处理程序,在发生 ReceiveCompletedPeekCompleted 事件时对这些事件进行处理。

  • 可使用回调自动监视传入的消息,并在消息到达时将处理传递给应用程序。

使用事件通知时,创建一个方法来处理消息,并在处理完成时返回通知。然后调用开始异步处理的方法。双击设计器中的 MessageQueue 组件时,系统会自动创建事件处理程序。

说明:

在事件通知方案中,BeginPeekBeginReceive 返回单个消息,然后停止处理。必须为每个要检索的消息再次调用 BeginPeekBeginReceive

另一种异步处理消息的方法是使用回调。回调可以标识要与 BeginPeekBeginReceive 操作关联的委托。此方案中,委托在处理每个消息后继续监视新的事件通知。

请参见

任务

如何:异步接收消息

如何:查看消息

如何:以编程方式接收消息

其他资源

读取和接收消息