Как мне реализовать часть длинного опроса на стороне сервера C# для запросов ajax?

У меня есть архитектура, которая включает в себя браузеры, опрашивающие обновления через ajax каждые 3 секунды, и я хотел бы изменить это на длинный опрос.

Мне бы хотелось, чтобы 1, 2.. {n} клиентов долго опрашивали, ожидали обновления и что-то происходило на сервере, чтобы дать сигнал ожидающим клиентам вернуться. Моей первой мыслью было использовать EventWaitHandle и я могу сделать это легко, если я просто хочу поддержать 1 клиента. Я бы просто AutoResetEventWaitHandle это было бы WaitOne заблокировать клиента, может быть с таймаутом, а может и нет. В любом случае, AutoResetEvent Позволит мне поддерживать только 1 клиента (так как он только пробуждает 1 ожидающий поток), и я хочу n клиентов.

Я уверен, что мне нужно использовать ManualResetEventWaitHandle но я не уверен когда звонить Reset после того как я Set это (при пробуждении темы). Должен ли я просто Thread.Sleep какое-то произвольное количество между Set а также Reset?

В коде псевдо логика пробуждения будет

  • получить ManualResetEventWaitHandle
  • вызов Set
  • убедитесь, что все ожидающие клиенты проснулись, при этом не пропуская новые запросы
  • вызов Reset теперь, когда все ожидающие клиенты получили свои обновления

Это та третья строка, с которой мне трудно. В настоящее время я мечтаю о LastTxID клиент / сервер поддерживает и потенциально использует 2 дескриптора ожидания. Однако, прежде чем я сошел с ума от этой реализации, я хотел получить обратную связь здесь, чтобы увидеть, как они реализуют логику бодрствования.

Изменить: предположим, у меня есть проблемы, связанные с выяснением максимального числа одновременных пользователей, путем настройки IIS или хостинга через WCF или другого решения. Я только хочу сосредоточиться на логике бодрствования.

1 ответ

Одна идея, в псевдокоде

  • Поддерживать потокобезопасный список идентификаторов соединений, возможно, использовать идентификатор сеанса
  • Дайте каждому соединению свой собственный AutoResetEventWaitHandle
  • Потоко-безопасным способом, переберите эти дескрипторы ожидания и установите их при обновлении
  • в конце сеанса потокобезопасным способом удалите этот идентификатор соединения / сеанса из списка

Я хотел бы получить некоторую обратную связь по этому вопросу

против этого подхода

  • должен вести список соединений
  • должны сгенерировать дескрипторы ожидания {n} для {n} клиентов
Другие вопросы по тегам