2017-01-29 2 views
0

Я разрабатываю приложение server/client. Сервер выталкивает сообщение клиентам через определенные промежутки времени. Каждое сообщение может иметь другой атрибут времени.Отправка сообщений клиенту через веб-сокет. Каждое сообщение имеет разный временной интервал

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

ответ

1

Предполагая, что вы хотите использовать SignalR (вы добавили тег), простой таймер может сделать работу:

public sealed class MatchingSupervisor 
{ 
    private static readonly ILog Log = LogManager.GetLogger(typeof(MatchingSupervisor)); 
    private readonly IHubContext _hub; 
    private readonly Timer _timer; 

    #region Singleton 

    public static MatchingSupervisor Instance => SupervisorInstance.Value; 

    // Lazy initialization to ensure SupervisorInstance creation is threadsafe 
    private static readonly Lazy<MatchingSupervisor> SupervisorInstance = new Lazy<MatchingSupervisor>(() => 
      new MatchingSupervisor(GlobalHost.ConnectionManager.GetHubContext<YourHubClass>())); 

    private MatchingSupervisor(IHubContext hubContext) 
    { 
     _hub = hubContext; 
     _timer = new Timer(Run, null, 0, Timeout.Infinite); 
    } 

    #endregion 

    private async void Run(object state) 
    { 
     // TODO send messages to clients 

     // you can use _timer.Change(newInterval, newInterval) here 
     // if you need to change the next interval 
     var newInterval = TimeSpan.FromSeconds(60); 
     _timer.Change(newInterval, newInterval); 
    } 
} 

Чтобы обеспечить перезагрузится таймер, когда система или приложение перезапускается (система пошла вниз, приложение рециркуляцию, и т.д.), вы должны получить экземпляр в классе Owin запуска:

public class Startup 
{ 
    private MatchingSupervisor _conversationManager; 

    public void Configuration(IAppBuilder app) 
    { 
     // TODO app configuration 

     // Ensure supervisor starts 
     _supervisor = MatchingSupervisor.Instance; 
    } 
} 
+0

Это похоже на хороший подход. В моем случае у меня есть сценарий, например message1: send, а затем подождите 30 секунд, отправьте сообщение2, а затем подождите 60 секунд и т. Д. Должен ли я предоставить этот параметр времени в четвертом аргументе инициализатора таймера? – Seamus

+0

Ну, это зависит от логики вашего приложения. Собираетесь ли вы отправлять эти сообщения всем подключенным пользователям одновременно? В этом случае вы можете изменить интервал таймера каждый раз, когда вы отправляете сообщение, или вы можете просто использовать таймер для его запуска один раз и создать новый. Если вам нужно отправлять сообщения определенным пользователям с разными интервалами, это будет другой вопрос, не связанный с отправкой файлов с сервера на клиент. – xleon

+0

Отредактирован ответ на изменение интервала – xleon

0

Вы можете использовать Quartz.NET.

По тегам, я полагаю, вы используете C#, так что вы можете увидеть Microsoft doc о классе задач (это реализует тему)

+0

Вы также можете найти этот учебник: [Имитировать службу Windows с помощью ASP.NET для выполнения запланированных заданий] (https://www.codeproject.com/kb/aspnet/aspnetservice.aspx) –

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