2012-09-28 58 views
2

在天青服務總線的命名空間,有一個SubscriptionClient型,具有一個方法來啓動一個MessageSession以這種方式: -天青服務總線 - SubscriptionClient.AcceptMessageSession()與SubscriptionClient.BeginAcceptMessageSession()

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的引用?

回答

2

你應該調用的方法是這樣的:

  1. 調用begin方法與接受IAsyncResultSubscriptionClient的方法。
  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(); 
    } 
+0

哇,謝謝。我沒有注意到EndAcceptMessageSession()!的返回類型。這些天你是我的英雄。服務總線非常棒,但社區需要的不僅僅是方法描述的轉儲文件! –

+0

如果我想使用SubscriptionClient.BeginAcceptMessageSession(),然後使用MessageSession.BeginReceive(),可以從AcceptDone()中調用BeginReceive()嗎?在我看來,這是讓它們都異步運行但不能並行運行的唯一方法。 –