Как организовать двухстороннее асинхронное общение между компонентами одного приложения?
Тренировочное приложение по синхронизации содержимого двух папок.
Есть класс, который умеет синхронизировать две переданные ему папки (назовем его синхронизатор), отдельно есть консольное приложение, которое умеет взаимодействовать с пользователем и передавать данные синхронизатору (потуги на чистую архитектуру).
Периодически, когда у синхронизатора вылетает исключение, он при помощи event передает эту информацию консольному приложению, а оно пишет в лог (можно и на экран вывести). Такую одностороннюю передачу информации, если я правильно понимаю, кроме event'ов, можно реализовать еще и на Rx, и на появившихся в C# 8 async streams.
Теперь есть задача - при возникновении исключения спрашивать пользователя, продолжать ли процесс или прерваться. Для этого нужно двухстороннее асинхронное общение: синхронизатор отправляет запрос наверх и ждет ответ. Кажется, для бОльших масштабов подошел бы gRPC, но что использовать внутри маленькой программы? Хотелось бы на будущее освоить какой-нибудь шаблон, применимый и в "нормальных", больших приложениях.
Илья, пока в одном, т. к. в консольной проге никакого пользовательского ввода во время копирования нет (вот код, но я pre-junior в C#, так что запаситесь валерьянкой :). Если буду делать WPF-вариант, тогда отнесу в отдельный поток.
Собрались в кучу async streams, евенты, rx, и даже gRPC.
Можешь попробовать System.Threading.Channels, просто нужно будет создать по каналу на каждое направление.
С ними как раз взаимодействие происходит через async streams.
Дальше буду называть синхронизатор "агентом", а пользователя "контроллером".
Если произошло исключение, то "агент" отправляет соответствующее сообщение "контроллеру" и ждёт от него команду, что делать дальше.
Если "контроллер" посылает команду на завершение работы, то оба канала закрываются и "агент" выключается.
Если "контроллер" посылает команду на продолжение работы, то "агент" возвращается к работе.
Роман, да, я сначала отметил ответ Василия как верный и только потом поблагодарил его. Может быть, надо предпринять еще какие-то дополнительные телодвижения?