Ibrahim
Ibrahim

Reputation: 265

periodically sending messages to all clients using signalr

I want to send some data from server to all connected clients using hubs after a specific interval. How can I accomplish this using signalr hubs.

Upvotes: 4

Views: 14056

Answers (4)

Luke T O'Brien
Luke T O'Brien

Reputation: 2835

I have stumbled upon this post by Jason Roberts => http://dontcodetired.com/blog/post/Using-Server-Side-Timers-and-SignalR-in-ASPNET-MVC-Applications.aspx

He uses IRegisteredObject and HostingEnvironment.RegisterObject then a System.Threading.Timer in the class that does the work, I haven't tried it myself, but it looks exactly the sort of thing.

Upvotes: 1

leon.io
leon.io

Reputation: 2824

Use ReactiveExtensions and then setup an Observable.Interval call. Then reactive will automatically call the lambda which can broadcast to your clients.

Upvotes: 1

Karthik Chintala
Karthik Chintala

Reputation: 5545

Just add

Thread.Sleep(5000);

in your send Method.

Ex:

    public void Send(string name, string message)
    {
        Thread.Sleep(5000);
        //call the broadcast message to upadate the clients.
        Clients.All.broadcastMessage(name, message); 
    }

Hope it helps.

Edit

The following code renders the current time for every 5 seconds.

Here is script for it:

<script type="text/javascript">
    $(function () {
        $.connection.hub.logging = true;
        $.connection.hub.start();
        // Declare a proxy to reference the hub.  
        var chat = $.connection.chatHub;

        //Appending the responce from the server to the discussion id
        chat.client.currentTime = function (time) {
            $('#discussion').append("<br/>" + time + "<br/>");
        };

        // Start the connection. 
        $.connection.hub.start().done(function () {

            //Call the server side method for every 5 seconds
            setInterval(function () {
                var date = new Date();
                chat.client.currentTime(date.toString());
            }, 5000);
        });

    }); 
</script>

<div id="discussion"></div>

And on the HubClass write the following:

public class ChatHub: Hub
   {
        public void currentTime(string date)
        {
            Clients.All.broadCastTime(date);
        }
   }

Upvotes: -3

Artem Koshelev
Artem Koshelev

Reputation: 10607

Spin up the System.Threading.Timer, and from it's callback broadcast the message using specific hub.

Global.asax:

private Timer timer;
public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHubs("~/signalr2");
        timer = new Timer(TimerCallback(timerCallback), null, Timeout.Infinite, 1000);
    }
}

Check the “Broadcasting over a Hub from outside of a Hub” section in SignalR wiki page.

Upvotes: 6

Related Questions