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