2016-07-29 70 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