Как мне реализовать часть длинного опроса на стороне сервера C# для запросов ajax?
У меня есть архитектура, которая включает в себя браузеры, опрашивающие обновления через ajax каждые 3 секунды, и я хотел бы изменить это на длинный опрос.
Мне бы хотелось, чтобы 1, 2.. {n} клиентов долго опрашивали, ожидали обновления и что-то происходило на сервере, чтобы дать сигнал ожидающим клиентам вернуться. Моей первой мыслью было использовать EventWaitHandle
и я могу сделать это легко, если я просто хочу поддержать 1 клиента. Я бы просто AutoResetEvent
WaitHandle
это было бы WaitOne
заблокировать клиента, может быть с таймаутом, а может и нет. В любом случае, AutoResetEvent
Позволит мне поддерживать только 1 клиента (так как он только пробуждает 1 ожидающий поток), и я хочу n клиентов.
Я уверен, что мне нужно использовать ManualResetEvent
WaitHandle
но я не уверен когда звонить Reset
после того как я Set
это (при пробуждении темы). Должен ли я просто Thread.Sleep
какое-то произвольное количество между Set
а также Reset
?
В коде псевдо логика пробуждения будет
- получить
ManualResetEventWaitHandle
- вызов
Set
- убедитесь, что все ожидающие клиенты проснулись, при этом не пропуская новые запросы
- вызов
Reset
теперь, когда все ожидающие клиенты получили свои обновления
Это та третья строка, с которой мне трудно. В настоящее время я мечтаю о LastTxID
клиент / сервер поддерживает и потенциально использует 2 дескриптора ожидания. Однако, прежде чем я сошел с ума от этой реализации, я хотел получить обратную связь здесь, чтобы увидеть, как они реализуют логику бодрствования.
Изменить: предположим, у меня есть проблемы, связанные с выяснением максимального числа одновременных пользователей, путем настройки IIS или хостинга через WCF или другого решения. Я только хочу сосредоточиться на логике бодрствования.
1 ответ
Одна идея, в псевдокоде
- Поддерживать потокобезопасный список идентификаторов соединений, возможно, использовать идентификатор сеанса
- Дайте каждому соединению свой собственный AutoResetEventWaitHandle
- Потоко-безопасным способом, переберите эти дескрипторы ожидания и установите их при обновлении
- в конце сеанса потокобезопасным способом удалите этот идентификатор соединения / сеанса из списка
Я хотел бы получить некоторую обратную связь по этому вопросу
против этого подхода
- должен вести список соединений
- должны сгенерировать дескрипторы ожидания {n} для {n} клиентов