我想使用线程通过 signalR 发送通知
I want to Send Notification through signalR using thread
我想使用线程发送通知。我创建了线程,它可以无限次地迭代自己。这是我的代码。
public static class ThreadStartUp
{
public static void GetThread()
{
var thread = new Thread(ReminderHelperClas.IterateMethod);
thread.Start();
}
}
MY Static class with methods is
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 异常,尽管我已经提供了所有 parameters.Please 帮助我解决这个问题。
您不能只初始化集线器 class 并调用它的方法。要获取调用方法的集线器,您应该使用 GlobalHost.ConnectionManager.GetHubContext() 传递您想要获取其对象的集线器 class。例如
private readonly IHubContext _chatHub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
然后您现在可以使用聊天中心上下文并调用您想要的 Groups 或 Clients 属性 中的方法发送提醒以喜欢
_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();
}
我想使用线程发送通知。我创建了线程,它可以无限次地迭代自己。这是我的代码。
public static class ThreadStartUp
{
public static void GetThread()
{
var thread = new Thread(ReminderHelperClas.IterateMethod);
thread.Start();
}
}
MY Static class with methods is
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 异常,尽管我已经提供了所有 parameters.Please 帮助我解决这个问题。
您不能只初始化集线器 class 并调用它的方法。要获取调用方法的集线器,您应该使用 GlobalHost.ConnectionManager.GetHubContext() 传递您想要获取其对象的集线器 class。例如
private readonly IHubContext _chatHub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
然后您现在可以使用聊天中心上下文并调用您想要的 Groups 或 Clients 属性 中的方法发送提醒以喜欢
_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();
}