gpt4 book ai didi

c# - SignalR IHubContext 和线程安全

转载 作者:行者123 更新时间:2023-12-01 16:26:48 26 4
gpt4 key购买 nike

在下面的代码示例中,我实现了一个 SignalR Hub,它应该实现以下功能:

  • 客户端可以通过调用 Hub 的 Subscribe 方法(使用一组内部被视为组名称的 ID)来监听 Foo 实例的更改
  • 取消订阅的工作方式与调用取消订阅类似
  • Web 应用程序的服务层可能会通过调用 OnFooChanged 来通知订阅相应 ID(组)的连接客户端发生了更改

为中心上下文使用单例是否安全,还是我每次都需要在 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
}

最佳答案

引自server broadcast tutorial :

There are two reasons why you want to get the context just once: getting the context is an expensive operation, and getting it once ensures that the intended order of messages sent to clients is preserved.

因此,换句话说:使用 Lazy 单例是安全的,也是推荐的方法。如果您每次想要发送给客户端时都会获得新的上下文,那么您可能会面临以与预期不同的顺序发送消息的风险。

我不知道您为什么想要定期获得新的上下文。

关于c# - SignalR IHubContext 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23942213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com