2016-04-11 6 views
3

Ich möchte eine Art von Timer an den Server an alle angeschlossenen Clients senden. Ich konnte dies auf Knopfdruck tun. Aber was ich wirklich brauche, ist diesen Timer automatisch jede Sekunde zu senden.Senden Sie jede Sekunde eine Nachricht an Clients mit signalR mit C#

HTML

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Signalr Chat Messenger</title> 
    <script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script> 
    <script src="Scripts/jquery.signalR-1.0.0-rc1.js" type="text/javascript"></script> 
    <script src="signalr/hubs" type="text/javascript"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 

    <script type="text/javascript"> 
     $(function() { 

      var IWannaChat = $.connection.myChatHub; 

      IWannaChat.client.addMessage = function (message) { 
       $('#listMessages').append('<li>' + message + '</li>'); 
      }; 

      IWannaChat.client.addTest = function (timer) { 
       $('#lblTimer').text(timer); 
      }; 

      $("#SendMessage").click(function() { 
       IWannaChat.server.send($('#txtMessage').val()); 
      }); 

      $.connection.hub.start(); 

     }); 
    </script> 

    <div> 
     <input type="text" id="txtMessage" /> 
     <input type="button" id="SendMessage" value="broadcast" /><asp:Label ID="lblTimer" runat="server" Text="timer"></asp:Label> 
&nbsp;<ul id="listMessages"> 
     </ul> 
    </div> 
    </form> 
</body> 
</html> 

und das ist mein HUB

using System; 
using Microsoft.AspNet.SignalR.Hubs; 
using System.Threading; 

namespace SignalRChat 
{ 
    [HubName("myChatHub")] 
    public class LetsChat : Hub 
    { 
     DateTime dateTime2 = DateTime.Now; 
     string dateTime1 = "11.04.2016 15:49:00"; 




     public void send(string message) 
     { 
      //Thread.Sleep(1000); 
      var diffInSeconds = (Convert.ToDateTime(dateTime1) - dateTime2).TotalSeconds; 

      Clients.All.addMessage(message); 
      Clients.All.addTest(diffInSeconds.ToString()); 
      //Clients.All.addTest(dateTime1.ToString()); 
     } 


    } 
} 

Antwort

1

Sie können von System.Timers.Timer machen, das zu tun:

public class LetsChat : Hub 
{ 
    private static readonly System.Timers.Timer _timer = new System.Timers.Timer(); 

    static LetsChat() 
    { 
     _timer.Interval = 1000; 
     _timer.Elapsed += TimerElapsed; 
     _timer.Start(); 
    } 

    static void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<LetsChat>(); 

     var diffInSeconds = (Convert.ToDateTime(dateTime1) - dateTime2).TotalSeconds; 

     hub.Clients.All.addMessage("Message"); 
     hub.Clients.All.addTest(diffInSeconds.ToString()); 
    } 

    public void send(string message) 
    { 
     //Thread.Sleep(1000); 
     var diffInSeconds = (Convert.ToDateTime(dateTime1) - dateTime2).TotalSeconds; 

     Clients.All.addMessage(message); 
     Clients.All.addTest(diffInSeconds.ToString()); 
     //Clients.All.addTest(dateTime1.ToString()); 
    } 

} 
+0

Danke. habe deinen Code ausprobiert, aber es funktioniert nicht. Vielleicht hast du etwas vergessen? – Barlet

+0

um klarer zu werden bekomme ich folgenden Fehler in der Leitung: send ("Message"); Ein Objektverweis wird für das nicht statische Feld, die Methode oder die Eigenschaft – Barlet

+0

benötigt, um die Antwort zu aktualisieren. Sie müssen den Hub innerhalb der verstrichenen Methode abrufen, da sie statisch ist. – Nitin