2016-07-29 68 views
0

我想通过使用线程发送通知。我创建了一个线程来迭代自己的无限时间。这是我的代码。我想通过signalR使用线程发送通知

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

} 

我的方法静态类是

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; 
     } 
    } 
} 

当消息被保存我叫发送通知的方法,但它给了我,虽然我已经提供了所有parameters.Please帮我空例外这个。

+1

甚至不够紧密哑了..我传递价值,还是给我空例外 –

回答

0

您不能只是初始化集线器类并调用它的方法。要使集线器调用方法,您应该使用要传递其对象的集线器类的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。所以问题在于你是否将信息发送给特定客户?如果一个特定的客户端,那么你必须得重写OnConnected()在ChatHub方法和获取和持久化的ConnectionId在内存或数据库中,那里面你CheckReminder方法,您现在访问connectionId并使用它将消息发送给特定用户。你可以做这样的事情。

public override Task OnConnected() 
     { 
      string connectionId = Context.ConnectionId; 
      IPrincipal user = Context.User; 

      //Save connection. 
      _clientManager.AddToCorrectGroup(user, connectionId; 

      return base.OnConnected(); 
     } 
+0

我没有得到clienConnectionString请你能帮助我这个 –

+0

的clientConnectionString是要在特定的客户端的ConnectionId发送消息给。 – Cizaphil

+0

检查我刚才对答案的编辑 – Cizaphil