我需要在总线上进行异步消息传递。
这是我使用的代码:
//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");
这是AsyncGet:
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的线程完成,并没有停止执行,因为我认为应该。 请告诉我这里我做错了什么。 谢谢!
答案 0 :(得分:2)
我只是仔细检查了源代码。这是设计的。
IAsyncResult上的等待句柄在操作完成时以及在调用回调之前被触发。异步结果的回调和等待句柄是等待操作完成的两种替代方法。要实现你想要做的事情 - 基于操作的完成阻塞你的线程并通过回调获得响应 - 你需要在你的app中有一个显式的等待句柄(ManualResetEvent)和Set()来表示为回调引发。