2017-09-26 34 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您可能是对的,而我们使用主题的另一个原因是因为如果我们使用订阅,那么每个订阅没有任何连接字符串,最终我们需要共享每个聆听者的连接字符串,如果他们知道任何他们将能够听到消息的主题中的其他订阅名称。 –

相关问题