Webロールとワーカーロールを接続するためにサービスバスを使用しています。私のワーカーロールは継続的なループにあり、QueueClient.Receive()メソッドを使用してWebロールによって送信されたメッセージを受信しています。
ただし、この方法では、サービスバスキューにメッセージがない場合、次の行に移動してさらに実行するのではなく、メッセージを受信するまで数秒待機します。私はメッセージを受信するための非同期の方法があることを望んでいましたか?または、この待機時間を設定するための少なくともいくつかの方法はありますか?
QueueClientのmsdnドキュメントからこのBeginReceiveメソッドを見つけました 。これ が私の質問に対する答えになることを期待していましたが、このメソッドの使用方法がわかりません。メソッドパラメータは非同期コールバックとオブジェクトの状態ですが、それらが何であるかはわかりません。
何か案は?
更新: Sandrinoによる優れたソリューションのおかげで、非同期で動作します。しかし、非同期であることは今私にいくつかの問題を与えています。VSがクラッシュしています。問題が何であるかわからない。以下は、使用しているコードです。
労働者の役割:
public override void Run()
{
while (!IsStopped)
{
// Receive the message from Web Role to upload the broadcast to queue
BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null);
// Receive the message from SignalR BroadcastHub
SignalRClient.BeginReceive(OnSignalRMessageReceived, null);
}
}
public void OnWebRoleMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedBroadcastMessage = null;
receivedBroadcastMessage = BroadcastClient.EndReceive(iar);
if (receivedBroadcastMessage != null)
{ //process message
receivedBroadcastMessage.Complete();
}
}
public void OnSignalRMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedSignalRMessage = null;
receivedSignalRMessage = SignalRClient.EndReceive(iar);
if (receivedSignalRMessage != null)
{
//process message
receivedSignalRMessage.Complete();
WorkerRoleClient.Send(signalRMessage);
}
}
VSを動作させてクラッシュさせるものを見逃していますか?BeginReceiveに移行する前は、iwがQueueClient.Receiveを使用していると、正常に動作し、クラッシュしなかったためです。
ありがとう