我根据他们的角色向个别用户发送消息,为了实现这一点,我有以下代码:
public static void Add(Guid userId, IEnumerable<SnapshotItem> snapshot)
{
var hub = GlobalHost.ConnectionManager.GetHubContext<FeedbackHub>();
var items = ApplicationDbContext.Instance.InsertSnapshot(userId, Guid.NewGuid(), snapshot);
foreach (var sendOperation in ConnectedUsers.Instance.EnumerateSendOperations(items))
{
hub.Clients.Users(sendOperation.Groups.SelectMany(x => x.Users).Select(x => x.Id).ToList()).OnDataFeedback(sendOperation.Items);
}
}
我不确定为什么每次需要发送内容时都必须调用.ToList()
,我的后备存储是HashSet<String>
而我希望SignalR能够使用这种类型的商店每次将它转换为List
,因为它显然会消耗处理能力和内存。
由于在后台,SignalR对参数用户或connectionId进行简单迭代,因此使用IEnumerable
代替IList
更为明智,我已经研究过了SignalR来源,难道难以实现吗?是否有使用IList
的特殊原因?
修改
在SignalR github页面上创建了一个问题,必须等待其中一个实际开发人员才能清除...
答案 0 :(得分:3)
就我可以看到挖掘旧的源代码而言,没有充分的理由。具有讽刺意味的是,IList<string>
被传递到MultipleSignalProxy
类it is promptly mapped to a different format using another LINQ expression,然后是.ToList()
&#39; d。因此,根据实施中的确切用法,他们真的不需要IEnumerable<string>
以外的任何内容。
答案 1 :(得分:1)
我最好的答案是SignalR在内部使用IList的增强功能,例如获取计数,或迭代集合以及您将用于IList但不使用ICollection的基于索引的访问的额外使用。使用更健壮的类的唯一原因是因为他们正在使用它,或者感觉需要其他功能。否则,我会假设使用较轻的ICollection类或IEnumerable的最佳实践,基本上是Enumerable-&gt; Collection-&gt; List heirarchy的基类。