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

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

  

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

  

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

  

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

 Собрались в кучу async streams, евенты, rx, и даже gRPC.  

  

Можешь попробовать System.Threading.Channels, просто нужно будет создать по каналу на каждое направление.  

С ними как раз взаимодействие происходит через async streams.  

  

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

  

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

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

Если "контроллер" посылает команду на продолжение работы, то "агент" возвращается к работе.