Как работать с push-моделью так, как будто это pull-модель?
Здравствуйте!
Пишу небольшую библиотеку для клиент-серверного взаимодействия на языке C#. В ней есть компонент, который я называю асинхронным прослушивателем. Как следует из названия, данный компонент в асинхронном режиме прослушивает сеть и при появлении входящих данных уведомляет об этом заинтересованную сторону. Всё хорошо, если реализуемый протокол работает по принципу "получение запроса - анализ запроса - ответ". Как можно видеть, в ответе будет вызвана обычная передача данных, а вот приём в библиотеке реализован исключительно через слой прослушивателя. Т.е. я не запрашиваю сам данные из сети, а лишь могу написать код, который как-то отреагирует на полученные данные. Как я понимаю, данная модель программирования называется реактивной, или же, если говорить о том, что не мы запрашиваем данные, а они сами к нам приходят, то push-моделью. Но, что если мне понадобится где-то в коде получить данные явно? Пусть структура моего алгоритма построена так, что сначала я получаю какие-то данные, анализирую их, отправляю ответ и, возможно, повторяю это несколько раз. Т.е. имеет место быть последовательное исполнение алгоритма, состоящее из нескольких этапов, а не просто единичные реакции на запросы. Конечно, можно было бы инкапсулировать данный алгоритм в класс и сделать его потребителем данных, поставляемых прослушивателем. Но это не очень удобно. Кроме того, придётся еще отслеживать порядок получения данных. Могут возникнуть и другие проблемы. Например, что если пришли данные для следующего шага алгоритма, а предыдущий еще не завершен? Итак, вопрос: как превратить реактивную модель программирования в обычную или же как сделать так, что как-будто я сам инициирую получение данных?
Решение этой проблемы у меня есть. Данные, получаемые прослушивателем, я помещаю в потокобезопасную очередь, далее, когда эти данные становятся необходимы в конкретном шаге определенного алгоритма, они извлекаются оттуда. Если данных нет, происходит асинхронная блокировка. Данный подход работает, но меня интересует, как можно сделать оптимальнее.