Как организовать двухстороннее асинхронное общение между компонентами одного приложения?

Тренировочное приложение по синхронизации содержимого двух папок.

Есть класс, который умеет синхронизировать две переданные ему папки (назовем его синхронизатор), отдельно есть консольное приложение, которое умеет взаимодействовать с пользователем и передавать данные синхронизатору (потуги на чистую архитектуру).

Периодически, когда у синхронизатора вылетает исключение, он при помощи event передает эту информацию консольному приложению, а оно пишет в лог (можно и на экран вывести). Такую одностороннюю передачу информации, если я правильно понимаю, кроме event'ов, можно реализовать еще и на Rx, и на появившихся в C# 8 async streams.

Теперь есть задача - при возникновении исключения спрашивать пользователя, продолжать ли процесс или прерваться. Для этого нужно двухстороннее асинхронное общение: синхронизатор отправляет запрос наверх и ждет ответ. Кажется, для бОльших масштабов подошел бы gRPC, но что использовать внутри маленькой программы? Хотелось бы на будущее освоить какой-нибудь шаблон, применимый и в "нормальных", больших приложениях.
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
Собрались в кучу async streams, евенты, rx, и даже gRPC.

Можешь попробовать System.Threading.Channels, просто нужно будет создать по каналу на каждое направление.
С ними как раз взаимодействие происходит через async streams.

Дальше буду называть синхронизатор "агентом", а пользователя "контроллером".

Если произошло исключение, то "агент" отправляет соответствующее сообщение "контроллеру" и ждёт от него команду, что делать дальше.
Если "контроллер" посылает команду на завершение работы, то оба канала закрываются и "агент" выключается.
Если "контроллер" посылает команду на продолжение работы, то "агент" возвращается к работе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы