Azure Service Bus - SubscriptionClient.AcceptMessageSession()与SubscriptionClient.BeginAcceptMessageSession()

时间:2012-09-28 12:08:21

标签: azure servicebus azureservicebus

在Azure Service Bus命名空间中,有一个SubscriptionClient类型,其中包含以这种方式启动MessageSession的方法: -

MessageSession session = subscriptionClient.AcceptMessageSession(...);

这是同步版本,它返回MessageSession。该库还提供了一个异步版本BeginAcceptMessageSession()。这个让我失望,因为它调用了一个回调函数,传入一个IAsyncResult和你希望传递的状态对象。在我的例子中,我正在传递SubscriptionClient实例,以便我可以在SubscriptionClient上调用EndAcceptMessageSession()。 BeginAcceptMessageSession()的返回类型为void。

如何访问通过BeginAcceptMessageSession()接受的MessageSession?我在回调的结果参数中得到的全部是我的SubscriptionClient实例,我需要通过EndAcceptMessageSession()来终止BeginAcceptMessageSession()。

无法找到MessageSession参考。在这方面,文档没有帮助。在Google上搜索只显示了3页的搜索结果,其中大部分只是MSDN中方法本身的在线描述。我查看了AsyncManager.Parameters,它也是空的。

有谁知道应该如何调用BeginAcceptMessageSession(),以便我可以获得对这样创建的MessageSession的引用?

1 个答案:

答案 0 :(得分:2)

你应该调用这样的方法:

  1. 使用接受IAsyncResultSubscriptionClient的方法调用begin方法。
  2. 在另一种方法(本例中为AcceptDone)中,使用EndAcceptMessageSession致电IAsyncResult以获取MessageSession
  3. 您在此处看到的是异步编程模型的标准实现。

        private static void Do()
        {
            SubscriptionClient client = ...
            client.BeginAcceptMessageSession(AcceptDone, client);
        }
    
        public static void AcceptDone(IAsyncResult result)
        {
            var subscriptionClient = result.AsyncState as SubscriptionClient;
            if (subscriptionClient == null)
            {
                Console.WriteLine("Async Subscriber got no data.");
                return;
            }
    
            var session = subscriptionClient.EndAcceptMessageSession(result);
            ...
    
            subscriptionClient.Close();
        }