首页 文章

Azure ServiceBus SubscriptionClient.EndReceive()返回null

提问于
浏览
1

我在SubscriptionClient上调用BeginReceive(),如下所示:

client.BeginReceive(new TimeSpan(6, 0, 0), new AsyncCallback(DownloadResults), null);

在DownloadResults()回调中,我调用client.EndReceive()[client是该类的静态成员]

static public void DownloadResults(IAsyncResult ar)
{
    // Get the message from the service bus.
    msg = client.EndReceive(ar);
    if (msg == null)
    {
        Console.WriteLine("Error!");
        return;
    }
}

有时client.EndReceive()返回 null . 通过查看SubscriptionClient.EndReceive()的MSDN页面来确定EndReceive()何时返回 null ,这一点并不十分清楚 . 是因为我在BeginReceive()中指定的时间限制被超出了吗?还是因为有错误?

2 回答

  • 0

    看来如果超过时间限制,则调用回调 . 当我们尝试通过调用 SubscriptionClient.EndReceive() 来检索消息时,将返回 null .

    默认超时值为一分钟,无法设置无限超时 . 如果您想要无限超时,如果消息是 null ,则可以再次调用 SubscriptionClient.BeginReceive() .

    例如:

    static public void DownloadResults(IAsyncResult ar)
    {
        // Get the message from the service bus.
        msg = client.EndReceive(ar);
        if (msg == null)
        {
            // Start waiting for the message again.
            client.BeginReceive(new TimeSpan(6, 0, 0), new AsyncCallback(DownloadResults), null);
            return;
        }
    }
    

    资料来源:http://social.msdn.microsoft.com/Forums/windowsazure/en-US/b14587ce-3fc7-4b56-8a35-4f2c6babce26/servicebus-subscriptionclientendreceive-returns-null

  • 1

    Receive的 Contract 规定ServiceBus不会抛出异常 . 当Receive / BeginReceive / ReceiveAsync超时时,调用将执行返回值所需的任何操作(例如执行回调),并在超时情况下返回null .

相关问题