Как правильно выполнять длительный опрос в MVC 3

Я пытаюсь подключить AsyncController так, чтобы когда пользователь нажимал кнопку «Сохранить» в заказе на странице заказа, все пользователи, просматривающие один и тот же заказ, получали уведомление об изменении заказа. Мой подход к реализации этого состоит в том, чтобы выполнять длинные запросы ajax на странице заказа, однако, как сделать масштабируемый AsyncController для работы с этим, для меня не очевидно.

Итак, это то, что у меня есть на данный момент: идентификатор — это идентификатор заказа, который сигнализируется как измененный или опрашиваемый на наличие изменений.

public class MessageController : AsyncController
{
    static readonly ConcurrentDictionary Events = new ConcurrentDictionary();

    public ActionResult Signal(int id)
    {
        AutoResetEvent @event;
        if (Events.TryGetValue(id, out @event))
            @event.Set();

        return Content("Signal");
    }

    public void WaitAsync(int id)
    {
        Events.TryAdd(id, new AutoResetEvent(false));

        // TODO: This "works", but I should probably not block this thread.
        Events[id].WaitOne();
    }

    public ActionResult WaitCompleted()
    {
        return Content("WaitCompleted");
    }
}

Я просмотрел Как выполнять AJAX-запросы с длительным опросом в ASP.NET MVC?. Я пытаюсь понять все детали этого кода, но, насколько я понимаю, этот код блокирует каждый рабочий поток в пуле потоков, что, насколько я понимаю, в конечном итоге приведет к голоданию потока.

Итак, как мне реализовать это красиво и масштабируемо? Имейте в виду, что я не хочу больше использовать какие-либо сторонние компоненты, я хочу получить хорошее представление о том, как правильно реализовать этот сценарий.

5
задан Community 23 May 2017 в 10:34
поделиться