gpt4 book ai didi

c# - SignalR通知系统

转载 作者:行者123 更新时间:2023-11-30 20:06:38 24 4
gpt4 key购买 nike

这是我第一次使用 SignalR。我正在尝试构建一个通知系统,其中服务器定期检查以查看是否有要广播的内容(查询数据库),如果有则将其广播给所有客户端。我遇到了 this post on Stackoverflow 并想知道修改代码以在特定时间间隔进行数据库调用是否确实是正确的方法。如果没有,是否有更好的方法?

我确实看到这里发布了很多与通知相关的问题,但没有一个包含任何代码。因此这篇文章。

这是我正在使用的确切代码:

public class NotificationHub : Hub
{
public void Start()
{
Thread thread = new Thread(Notify);
thread.Start();
}

public void Notify()
{
List<CDCNotification> notifications = new List<CDCNotification>();
while (true)
{
notifications.Clear();
notifications.Add(new CDCNotification()
{
Server = "Server A", Application = "Some App",
Message = "This is a long ass message and amesaadfasd asdf message",
ImgURL = "../Content/Images/accept-icon.png"
});
Clients.shownotification(notifications);
Thread.Sleep(20000);
}
}
}

我已经看到一些奇怪的行为,通知比预期的更频繁。尽管我应该每 20 秒收到一次,但我大约 4-5 秒收到一次,而且我收到了多条消息。这是我的客户:

var notifier = $.connection.notificationHub;
notifier.shownotification = function (data) {
$.each(data, function (i, sample) {
var output = Mustache.render("<img class='pull-left' src='{{ImgURL}}'/> <div><strong>{{Application}}</strong></div><em>{{Server}}</em> <p>{{Message}}</p>", sample);
$.sticky(output);
});
};

$.connection.hub.start(function () { notifier.start(); });

最佳答案

注意事项:

  1. 一旦第二个客户端连接到您的服务器,就会有 2 个线程发送通知,因此如果您有多个客户端,您的间隔将小于 20 秒
  2. 在 ASP.NET 中手动处理线程被认为是不好的做法,您应该尽可能避免这种做法
  3. 一般来说,这闻起来很像轮询,这是 SignalR 让您摆脱的一种东西,因为您不需要向服务器/客户端发送信号

为了解决这个问题,您需要做这样的事情(同样,网络应用程序中的线程通常不是一个好主意):

public class NotificationHub : Hub
{
public static bool initialized = false;
public static object initLock = new object();

public void Start()
{
if(initialized)
return;

lock(initLock)
{
if(initialized)
return;

Thread thread = new Thread(Notify);
thread.Start();

initialized = true;
}
}

public void Notify()
{
List<CDCNotification> notifications = new List<CDCNotification>();
while (true)
{
notifications.Clear();
notifications.Add(new CDCNotification() { Server = "Server A", Application = "Some App", Message = "This is a long ass message and amesaadfasd asdf message", ImgURL = "../Content/Images/accept-icon.png" });
Clients.shownotification(notifications);
Thread.Sleep(20000);
}
}
}

static 初始化标志阻止创建多个线程。围绕它的锁定是为了确保标志只设置一次。

关于c# - SignalR通知系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585755/

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