c# - QueueClient.Receive() 的异步方法?

标签 c# asp.net asp.net-mvc-4 azure azure-servicebus-queues

我正在使用服务总线来连接 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/

相关文章:

c# - 执行其他功能时,SheetChange 事件未获取事件 Excel 单元格的更改

带有子菜单项的 asp.net 菜单,由后面的代码重定向

asp.net-mvc - 如何将特定于 HTTP 请求的对象注入(inject) Unity 提供的对象?

c# - Windows 8 Metro TextBlock 动画

c# - 无法使用动态 linq 两次检查同一属性

c# - AutoProperty 和 Member 有什么区别

asp.net-mvc - 直接nuget在哪里放置文件

asp.net - ASP.net 中的免费 PDF 查看器

asp.net - ORACLE/ASP.NET : ORA-2020 - Too many database links. ..是什么原因造成的?

asp.net - 不支持每种类型多个对象集。对象集 'ApplicationUsers'和 'Users'都可以包含ApplicationUser类型的实例