2

在 Azure 服务总线命名空间中,有一种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 的引用?

4

1 回答 1

2

您应该像这样调用该方法:

  1. IAsyncResult使用接受和 的方法调用 begin 方法SubscriptionClient
  2. 在另一种方法中(在本例中为 AcceptDone)EndAcceptMessageSessionIAsyncResult调用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();
    }
于 2012-09-28T12:36:52.543 回答