2012-04-24 9 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の待機ハンドルは、操作が完了し、コールバックが呼び出される前にトリガされます。非同期結果のコールバックと待機ハンドルは、操作の完了を待機する2つの代替メソッドです。ここでやりたいことを達成するには、操作の完了に基づいてスレッドをブロックし、コールバックを介して応答を得るには、あなたのアプリケーションに明示的に待機ハンドル(ManualResetEvent)を設定し、コールバックが発生します。

関連する問題