периодическая отправка сообщений всем клиентам с помощью signalr

Я хочу отправить некоторые данные с сервера всем подключенным клиентам с помощью концентраторов через определенный интервал. Как я могу сделать это, используя сигнальные концентраторы.


person Ibrahim    schedule 19.03.2013    source источник
comment
Вы смотрели пакет SignalR.Sample NuGet? Он делает это. Мы планируем опубликовать учебник на сайте ASP.NET на следующей неделе или через две.   -  person tdykstra    schedule 19.03.2013


Ответы (4)


Просто добавь

Thread.Sleep(5000);

в вашем методе отправки.

Ex:

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

Надеюсь, поможет.

Изменить

Следующий код отображает текущее время каждые 5 секунд.

Вот скрипт для него:

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

И на HubClass напишите следующее:

public class ChatHub: Hub
   {
        public void currentTime(string date)
        {
            Clients.All.broadCastTime(date);
        }
   }
person Karthik Chintala    schedule 19.03.2013
comment
Я не хочу задерживать отправку сообщения. Скорее я хочу периодически отправлять им сообщения. Скажем, через каждые 5 секунд я хочу отправить им текущую дату и время. - person Ibrahim; 19.03.2013
comment
@Ibrahim Используйте таймер. Либо из функции С#, либо jquery ajax с использованием setinterval. - person Monie corleone; 19.03.2013
comment
как бы я использовал таймер со стороны сервера (С#). просто маленький пример. Я знаю, как использовать со стороны клиента. - person Ibrahim; 19.03.2013
comment
@Ibrahim, для этой цели вы должны использовать setInterval. Я отредактирую свой пост через пару минут, чтобы дать вам код для периодического запуска - person Karthik Chintala; 19.03.2013
comment
Я не понимаю, как это отвечает на первоначальный вопрос: OP хочет транслировать обновления с сервера подключенным клиентам по таймеру на стороне сервера (не отталкиваться от других клиентов или просто задерживаться с помощью thread.sleep). - person Matt Randle; 15.02.2015

Запустите System.Threading.Timer и из его обратного вызова передайте сообщение, используя определенный концентратор.

Глобальный.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);
    }
}

Ознакомьтесь с разделом «Вещание через концентратор из-за пределов концентратора» на вики-странице SignalR. .

person Artem Koshelev    schedule 19.03.2013
comment
Я пробовал и так. Но он все еще не работает. Для двойной проверки я добавил var context = GlobalHost.ConnectionManager.GetHubContext‹Chat›(); context.Clients.All.PublishMessage(ник, сообщение); в методе sendmessage простого приложения чата. Но это не работает. - person Ibrahim; 19.03.2013
comment
context.Clients.All.PublishMessage, удаляющий All из этого, сработал для меня. - person Ibrahim; 19.03.2013
comment
@Ibrahim, я удаляю все, что сработало для вас, тогда вам нужно обновить SignalR. Вы используете действительно старую версию, и с тех пор мы выпустили еще около 6 версий. - person davidfowl; 19.03.2013

Используйте ReactiveExtensions, а затем настройте < вызов href="http://msdn.microsoft.com/en-us/library/hh228911%28v=vs.103%29.aspx" rel="nofollow">Observable.Interval. Затем реактив автоматически вызовет лямбду, которая может транслироваться вашим клиентам.

person leon.io    schedule 19.03.2013

Я наткнулся на этот пост Джейсона Робертса => http://dontcodetired.com/blog/post/Using-Server-Side-Timers-and-SignalR-in-ASPNET-MVC-Applications.aspx

Он использует IRegisteredObject и HostingEnvironment.RegisterObject, а затем System.Threading.Timer в классе, который выполняет эту работу, я сам не пробовал, но выглядит именно так.

person Luke T O'Brien    schedule 05.12.2014