首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueueClient.Receive()的异步方法?

QueueClient.Receive()的异步方法?
EN

Stack Overflow用户
提问于 2013-02-13 11:38:02
回答 3查看 3.1K关注 0票数 4

我使用服务总线连接web角色和工作者角色。我的worker角色处于一个连续循环中,并且我正在接收web角色使用QueueClient.Receive()方法发送的消息。

但是,使用此方法,如果服务总线队列中没有消息,它将等待几秒钟来接收消息,而不是移动到下一行进行进一步执行。我希望有一些异步的方法来接收消息?或者至少有某种方法来设置这个等待时间?

我从msdn的QueueClient文档中找到了这个QueueClient方法,我希望这将是我问题的答案,但我不知道如何使用这个方法。方法参数是异步回调和对象状态,我不知道它们是什么。

有什么想法吗?

更新:多亏了Sandrino的一个很好的解决方案,它可以异步工作。但是异步现在给我带来了一些问题。我的VS要崩溃了。不知道问题出在哪里。下面是正在使用的代码。

工人角色:

代码语言:javascript
复制
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时,它工作得很好,没有崩溃。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-13 12:05:48

在您的情况下,BeginReceive方法就是方法。您通常会这样称呼它:

代码语言:javascript
复制
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>();
         ...
     }
}
票数 6
EN

Stack Overflow用户

发布于 2014-11-03 15:07:21

我就是这样做的(扩展Sandrino De Mattia的解决方案):

代码语言:javascript
复制
void SomeMethod() 
{
    ...
    client.BeginReceive(TimeSpan.FromSeconds(5), OnMessageReceived, null);
    ...
}

void OnMessageReceived(IAsyncResult iar)
{
    if(!IsStopped)
    {
        var msg = client.EndReceive(iar);
        if (msg != null)
        {
            var body = msg.GetBody<MyMessageType>();

            ... //Do something interesting with the message

            //Remove the message from the queue
            msg.Complete();

            client.BeginReceive(TimeSpan.FromSeconds(5), OnMessageReceived, null);
        }
    }
}

这样我就有了一个“无止境的循环”和一个停止机制。

票数 1
EN

Stack Overflow用户

发布于 2015-12-17 10:31:04

Azure ServiceBus SDK (下载链接)的最新版本完全支持异步接收消息:

代码语言:javascript
复制
async Task TestMethod()
{
    string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

    QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, "TestQueue");
    var message = await Client.ReceiveAsync();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14852670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档