1

我需要在总线上进行异步消息传递。

这是我正在使用的代码:

    //set callback to get the message
    MessageReceiver messageReceiver = MessagingFactory.CreateMessageReceiver(BaseTopicName + "/subscriptions/" + addressee, 
        ReceiveMode.PeekLock);
    IAsyncResult result = messageReceiver.BeginReceive(AsyncGet, messageReceiver);
    Debug.WriteLine("After BeginReceive");
    // Wait for the WaitHandle to become signaled.
    Thread.Sleep(0);
    result.AsyncWaitHandle.WaitOne();
    // Close the wait handle.
    result.AsyncWaitHandle.Close();
    //return the information
    Debug.WriteLine("return the information");

这是异步获取:

public void AsyncGet(IAsyncResult result)
{
    Debug.WriteLine("Start AsyncGet");
    MessageReceiver messageReceiver = result.AsyncState as MessageReceiver;
    BrokeredMessage = messageReceiver.EndReceive(result);
    Debug.WriteLine("Finish AsyncGet");
    messageReceiver.Close();
}

我得到的输出是:

    After BeginReceive
    return the information
    Start AsyncGet
    Finish AsyncGet

它说那行 result.AsyncWaitHandle.WaitOne(); 正如我认为的那样,直到 AsyncGet 的线程完成后才停止执行。请告诉我我在这里做错了什么。谢谢!

4

1 回答 1

2

我只是仔细检查了源代码。这是设计使然。

IAsyncResult 上的等待句柄在操作完成时和回调被调用之前被触发。异步结果的回调和等待句柄是等待操作完成的两种替代方法。要在此处实现您想要做的事情 - 根据操作的完成阻塞您的线程并通过回调获取响应 - 您需要在您的应用程序中有一个明确的等待句柄 (ManualResetEvent) 和 Set() 以发出信号回调触发。

于 2012-05-10T20:19:05.200 回答