C# 为什么Signal在其合同中以及在其内部的任何地方使用IList而不是IEnumerable?
我将根据个人用户的角色向他们发送消息,以实现以下目的:C# 为什么Signal在其合同中以及在其内部的任何地方使用IList而不是IEnumerable?,c#,signalr,C#,Signalr,我将根据个人用户的角色向他们发送消息,以实现以下目的: public static void Add(Guid userId, IEnumerable<SnapshotItem> snapshot) { var hub = GlobalHost.ConnectionManager.GetHubContext<FeedbackHub>(); var items = ApplicationDbContext.Instance.InsertSnapshot(u
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);
}
}
publicstaticvoidadd(Guid用户ID,IEnumerable快照)
{
var hub=GlobalHost.ConnectionManager.GetHubContext();
var items=ApplicationDbContext.Instance.InsertSnapshot(userId,Guid.NewGuid(),snapshot);
foreach(ConnectedUsers.Instance.EnumerateSendOperations(items)中的var SendOperations)
{
hub.Clients.Users(sendOperation.Groups.SelectMany(x=>x.Users.Select(x=>x.Id.ToList()).OnDataFeedback(sendOperation.Items);
}
}
我不知道为什么每次我需要发送东西时都要调用.ToList()
,我的备份存储是HashSet
,我希望signar使用这种类型的存储,而不是每次都将其转换为List
,因为它显然会消耗处理能力和内存
既然在后台,SignalR正在对参数users或ConnectionId进行简单的迭代,那么使用IEnumerable
而不是IList
会更明智吗?我已经研究了SignalR的源代码,这应该不难实现?使用IList是否有特定的原因
编辑
在SignalR github页面上创建了一个问题,将不得不等待一个实际的开发人员来解决问题…就我所能看到的挖掘旧的源代码而言,没有什么好的理由。具有讽刺意味的是,
IList
被交给了MultipleSignalProxy
类,然后就是.ToList()
'd。因此,基于实现中的确切用法,他们只需要IEnumerable
我最好的答案是,SignalR在内部使用IList的增强功能,如获取计数,或迭代集合,并额外使用IList使用的基于索引的访问,但不是我收集的。使用更健壮的类的唯一原因是因为他们在某处使用它,或者觉得需要额外的功能。否则,我将假设使用较轻的ICollection类或IEnumerable的最佳实践,基本上是可枚举->集合->列表继承权的基类
G好吧,你必须让开发者得到正确的答案,对吗?我必须先问Stackoverflow,对吗?;)但是你的问题被问到的方式,没有人能真正回答它,除非真正的开发者出现来回答it@Patrick不一定,对源代码有足够了解的人可以解释。@Groo:在任何情况下,系统都会保留引用,直到任务完成为止,至于等待signar的开发人员,我想说以下几点:如果你没什么可说的,什么也不说:)这不是最大的问题,但是,我看到
公共抽象类订阅:ISubscription,IDisposable
包含公共IList事件密钥{get;private set;}
属性,该属性稍后通过私有bool AddEventCore(字符串键)
和公共虚拟void RemoveEvent(字符串键)
,特别是事件键。包含(键)
,事件键。添加(键)代码>和事件键。删除(键)代码>发出了调用,这些是什么?我看到信号器中有这么多ToList操作,但不知道为什么会发生这种情况看起来很可怕,与NodeJS Socket.io实现相比,信号器看起来像是一个过度杀伤力。。。