2017-09-26 18 views
0

我想從事件中心向服務總線中的多個主題發送一個事件。我正在使用以下代碼使用foreach將事件發送到多個主題以獲取主題名稱。 由於這是一個foreach循環,我得到了延遲。有沒有更好的方法來做到這一點。向服務總線中的多個主題發送一個事件

foreach (var topicname in GetTopics_ActiveList(payload).Result) 
        { 
         TopicClient Client = TopicClient.CreateFromConnectionString(connectionstring, topicname); 
         var payloadStream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); 
         //var msg = JsonConvert.SerializeObject(payloadStream); 

         //BrokeredMessage message = new BrokeredMessage(payloadStream, true); 
         BrokeredMessage message = new BrokeredMessage(payloadStream); 
         Client.Send(message); 
        } 

回答

0

有沒有更好的方式來做到這一點。

總是。對於初學者,您可以緩存客戶端,而不是每次都創建。其次,使用發送方法的異步發送版本(SendAsync),但不是一次發送一個,收集任務並等待Task.WhenAll。並在循環中構建您的中介消息一次並clone it。的

var msg = BuildYourMessage(); 
var sendTasks = new List<Task>(); 
foreach (var topic in topicsCache) 
{ 
    sendTasks.Add(client.SendAsync(msg.Clone())); 
} 
Tasks.WhenAll(sendTasks).ConfigureAwait(false); 

在電線之間的東西我已經是個問題,爲什麼您把它送到多個主題,而不是多個訂閱一個主題?也許你可以放棄這一點,並單獨發送到該主題,委派到Azure服務總線來執行所有訂閱的廣播。

+0

1.我將無法緩存客戶端,因爲它的更改取決於我正在處理的事件。每個事件都會涉及一定數量的話題。 2.我可以在一個主題中有多個訂閱,但是當訂閱數量增加時,它最終會變慢。感謝您的快速響應。 –

+0

我不確定#2。發送給主題的消息分發到訂閱是在代理上完成的。這聽起來很不錯,它比發送單個消息到所有主題要慢。 –

+0

#2您可能是對的,而我們使用主題的另一個原因是因爲如果我們使用訂閱,那麼每個訂閱沒有任何連接字符串,最終我們需要共享每個聆聽者的連接字符串,如果他們知道任何他們將能夠聽到消息的主題中的其他訂閱名稱。 –

相關問題