Azure服务总线-SubscriptionClient.AcceptMessageSession()与SubscriptionClient.BeginAcceptMessageSession()的比较

Azure服务总线-SubscriptionClient.AcceptMessageSession()与SubscriptionClient.BeginAcceptMessageSession()的比较,azure,servicebus,azureservicebus,Azure,Servicebus,Azureservicebus,在Azure Service Bus命名空间中,有一个SubscriptionClient类型,该类型具有一个以以下方式启动MessageSession的方法:- MessageSession session = subscriptionClient.AcceptMessageSession(...); 这是同步版本,它返回MessageSession。该库还提供了一个异步版本BeginAcceptMessageSession()。这一个让我大吃一惊,因为它调用回调,传入IAsyncResul

在Azure Service Bus命名空间中,有一个
SubscriptionClient
类型,该类型具有一个以以下方式启动MessageSession的方法:-

MessageSession session = subscriptionClient.AcceptMessageSession(...);
这是同步版本,它返回MessageSession。该库还提供了一个异步版本BeginAcceptMessageSession()。这一个让我大吃一惊,因为它调用回调,传入IAsyncResult和您希望传递的任何状态对象。在本例中,我将传递SubscriptionClient实例,以便在SubscriptionClient上调用EndAcceptMessageSession()。BeginAcceptMessageSession()的返回类型为void

如何访问通过BeginAcceptMessageSession()接受的MessageSession?回调的result参数中返回的只是SubscriptionClient实例,我需要它来通过EndAcceptMessageSession()终止BeginAcceptMessageSession()

找不到MessageSession引用。文件在这方面没有帮助。在谷歌上搜索只显示了不到3页的搜索结果,其中大部分只是MSDN中对该方法本身的在线描述。我查看了AsyncManager.Parameters,它也是空的


有人知道应该如何调用BeginAcceptMessageSession(),以便我可以获得对由此创建的MessageSession的引用吗?

您应该这样调用该方法:

  • 使用接受
    IAsyncResult
    SubscriptionClient
    的方法调用begin方法
  • 在另一种方法中(本例中为AcceptDone),使用
    IAsyncResult
    调用
    EndAcceptMessageSession
    ,以获取
    MessageSession
  • 这里您看到的是异步编程模型的标准实现

        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();
        }
    

    哇,谢谢你。我没有注意到EndAcceptMessageSession()的返回类型!。这些天你是我的英雄。服务总线非常棒,但是社区需要的不仅仅是一堆方法描述作为文档!如果我想使用SubscriptionClient.BeginAcceptMessageSession(),然后使用MessageSession.BeginReceive(),那么从AcceptDone()中调用BeginReceive()是否可以接受?在我看来,这是让它们都异步运行,而不是并行运行的唯一方法。