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");

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 のスレッドが終了するまで実行を停止しませんでした。ここで何が間違っているのか教えてください。ありがとう!

4

1 に答える 1

2

ソースコードを再確認しました。これは仕様によるものです。

IAsyncResult の待機ハンドルは、操作が完了してコールバックが呼び出される前にトリガーされます。非同期結果のコールバックと待機ハンドルは、操作の完了を待機する 2 つの代替方法です。ここでやりたいことを達成するには、操作の完了に基づいてスレッドをブロックし、コールバックを介して応答を取得します。コールバックが発生します。

于 2012-05-10T20:19:05.200 に答える