2016-04-11 3 views
3

Я хочу отправить какой-то таймер на сервер всем подключенным клиентам. Я смог сделать это при нажатии кнопки. Но мне действительно нужно отправить этот таймер каждую секунду автоматически.Отправить сообщение каждую секунду клиентам, использующим signalR с 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> 

и это мой 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()); 
     } 


    } 
} 

ответ

1

Вы можете использовать System.Timers.Timer сделать:

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

Спасибо. попробовал ваш код, но он не работает. может, ты что-то забыл? – Barlet

+0

, чтобы быть более ясным, я получаю следующую ошибку в строке: send («Сообщение»); Ссылка на объект требуется для нестатического поля, метода или свойства – Barlet

+0

. вам нужно будет получить концентратор внутри прошедшего метода, поскольку он является статичным. – Nitin

Смежные вопросы