我想使用线程通过signalR发送通知

本文关键字:signalR 通知 线程 | 更新日期: 2023-09-27 17:59:14

我想使用线程发送通知。我已经创建了一个线程,它在无限的时间内迭代自己。这是我的密码。

    public static class ThreadStartUp
{
    public static void GetThread()
    {
        var thread = new Thread(ReminderHelperClas.IterateMethod);
        thread.Start();
    }
}

MY带有方法的静态类是

    public static class ReminderHelperClas
{
    public static void CheckReminder()
    {
        try
        {
            const string usernamesendby = "38";
            const string message = "Please give feedback to assigned task.";
            var chathub = new ChatHub();
            using (var db = new DatabaseContext())
            {
                var datetimenow = DateTime.Now;
                const TaskAssignStatus recordstatus = (TaskAssignStatus)3;
                var remindermodel =
                    db.ActionTaskVarainceCategories.Where(x => x.TaskAssignStatus != recordstatus)
                        .Select(x => x)
                        .ToList();
                foreach (var item in remindermodel)
                {
                    if (item.ToDate == datetimenow || item.ToDate < datetimenow)
                    {
                        var username = db.Users.Where(u => u.ID == item.AssignedToID).Select(u => u.UserName).FirstOrDefault();
                        var msgclass = new TaskMessagingModel { FromId = 38, Message = message, UserName = username, ToId = item.AssignedToID };
                        SaveMessages.TaskSaveMessage(msgclass);
                        chathub.Send(usernamesendby, message, username);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    public static void IterateMethod()
    {
        try
        {
            while (true)
            {
                CheckReminder();
                Thread.Sleep(10000);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

当消息被保存时,我调用了发送通知方法,但它给了我null异常,尽管我已经提供了所有参数。请帮我做这个。

我想使用线程通过signalR发送通知

不能只初始化hub类并调用其方法。若要获取要调用方法的集线器,应使用GlobalHost.ConnectionManager.GetHubContext()传入要获取其对象的集线器类。例如

private readonly IHubContext _chatHub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();

然后,您现在可以使用聊天中心上下文,并调用客户端属性中的方法,以便向类似发送提醒

_chatHub.Clients.Client(clientConnectionString)
                        .Send(usernamesendby, message, username);

有关更多详细信息,我建议您查看本教程http://www.asp.net/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

编辑clientConnectionString是您要将消息发送到的特定客户端的connectionId。所以问题是您是否将消息发送给特定客户端?如果对于特定的客户端,则必须覆盖ChatHub中的OnConnected()方法,并在内存或数据库中获取并保持connectionId,然后在CheckReminder方法中,您现在将访问connectionId并使用它向特定用户发送消息。你可以这样做。

 public override Task OnConnected()
        {
            string connectionId = Context.ConnectionId;
            IPrincipal user = Context.User;
            //Save connection.
            _clientManager.AddToCorrectGroup(user, connectionId;
            return base.OnConnected();
        }