2012-04-24 22 views
1

我需要在总线上进行异步消息传递。在ServiceBus上使用BeginReceive和EndReceive进行消息传递不适用于我

这是我使用的代码:

//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的线程完成后才停止执行,因为我认为它应该。 请告诉我我在这里做错了什么。 谢谢!

回答

2

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

IAsyncResult上的等待句柄在操作完成时以及调用回调之前被触发。异步结果上的回调和等待句柄是等待操作完成的两种备选方法。为了在这里实现你想要做的事情 - 根据操作的完成阻塞你的线程并通过回调获得响应 - 你需要在你的应用中有一个明确的等待句柄(ManualResetEvent),并且需要在Set()中标记为回调火灾。

相关问题