如果想检索消息但不阻碍应用程序的处理可异步检索消息在异步消息处理中启动任务的方法被立即返回而不等待结果应用程序可以在任务完成过程中继续它原来的工作任务完成时服务器可以通知应用程序消息已被成功处理 有两种类型的异步消息处理操作异步接收消息和异步查看消息异步检索消息时使用 BeginReceive 方法和 EndReceive 方法标记操作的开始和结束所发生的操作如下所示 当队列上的消息变得可用时或者如果要查看或接收的消息已经存在BeginReceive 方法将立即返回并引发名为 ReceiveCompleted 的事件 ReceiveCompleted 事件返回一个 IAsyncResult 类型的对象该对象包含有关异步操作的信息 接收到完成的事件后调用 EndReceive 方法完成操作在最后的调用中可以访问消息或通过访问 ReceiveCompletedEventArgs 类检索该消息 在操作的整个生存期内都可以访问 IAsyncResult 对象但通常在调用 EndReceive 后才会使用该对象但是如果启动多个异步操作则可将这些操作的 IAsyncResult 值放在数组中并指定是等待所有操作完成还是任一操作完成在这种情况下使用 IAsyncResult 对象的 AsyncWaitHandle 属性标识已完成的操作 与 Receive 一样Peek 使用两个名为 BeginPeek 和 EndPeek 的方法来标记异步操作的开始和结束当消息可用时BeginPeek 立即返回并引发名为 PeekCompleted 的事件与 ReceiveCompleted 一样该事件返回一个 IAsyncResult 对象可以通过使用该对象来获取此操作的有关信息 另外异步接收和查看操作均可使用超时时限来指定等待多长时间使消息变得可用要完成此操作可以使用任一方法的重载形式来传递一个 TimeSpan 对象指示等待的时间如果超时时间到期但 IAsyncResult 对象上的 IsCompleted 属性设置为 false指示有消息尚未处理时将引发 ReceiveCompleted 或 PeekCompleted 事件 |