在下面的代码示例中,我实现了一个应该实现以下功能的SignalR Hub:
对于集线器上下文使用单例是否安全,或者我是否每次都需要在 OnFooChanged 中获取它?关于其他方法的实施的反馈也是受欢迎的。毕竟我是SignalR的新手。
[Export]
public class FooHub : Hub
{
private static readonly Lazy<IHubContext> ctx = new Lazy<IHubContext>(
() => GlobalHost.ConnectionManager.GetHubContext<FooHub>());
#region Client Methods
public void Subscribe(int[] fooIds)
{
foreach(var fooId in fooIds)
this.Groups.Add(this.Context.ConnectionId, fooId.ToString(CultureInfo.InvariantCulture));
}
public void Unsubscribe(int[] fooIds)
{
foreach (var fooId in fooIds)
this.Groups.Remove(this.Context.ConnectionId, fooId.ToString(CultureInfo.InvariantCulture));
}
#endregion // Client Methods
#region Server Methods
/// <summary>
/// Called from service layer when an instance of foo has changed
/// </summary>
public static void OnFooChanged(int id)
{
ctx.Value.Clients.Group(id.ToString(CultureInfo.InvariantCulture)).onFooChanged();
}
#endregion // Server Methods
}
答案 0 :(得分:5)
有两个原因可以让您只想获取一次上下文: 获取上下文是一项昂贵的操作,并获得一次 确保发送给客户端的消息的预期顺序 保留。
因此,换句话说:使用Lazy单例是安全的,也是推荐的方法。如果您每次要发送给客户端时都会获得新的上下文,那么您将面临以不同于预期的顺序发送邮件的风险。
我不知道你为什么要定期获得新的背景。