我正在使用服务总线来连接 Web 角色和辅助角色。我的辅助角色处于连续循环中,并且我正在使用 QueueClient.Receive() 方法接收 Web 角色发送的消息。
但是使用这种方法,如果服务总线队列上没有消息,它会等待几秒钟来接收消息,而不是移动到下一行进一步执行。我希望有一些异步方法来接收消息?或者至少有某种方式来设置这个等待时间?
我从QueueClient的msdn文档中找到了这个BeginReceive方法我希望这将是我问题的答案,但我不知道如何使用这种方法。方法参数是异步回调和对象状态,我不知道它们是什么。
有什么想法吗?
更新: 感谢 Sandrino 的出色解决方案,它可以异步工作。但异步现在给我带来了一些问题。我的 VS 崩溃了。不确定是什么问题。下面是我使用的代码。
worker 角色:
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 时,它工作正常并且没有崩溃。
谢谢
最佳答案
BeginReceive
方法是适合您情况的方法。您通常会这样调用它:
void SomeMethod()
{
...
client.BeginReceive(TimeSpan.FromMinutes(5), OnMessageReceived, null);
...
}
void OnMessageReceived(IAsyncResult iar)
{
var msg = client.EndReceive(iar);
if (msg != null)
{
var body = msg.GetBody<MyMessageType>();
...
}
}
关于c# - QueueClient.Receive() 的异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14852670/