mvvm-приложение, в котором определён некий класс модели.
                  
                  
                  В этом классе есть метод вида
                  
                  
                  
                  
                  
                  
                  
                  
                  public async Task StartLoadSomeShitAsync(...);
                  
                  
                  
                  
                  
                  
                  
                  
                  внутри него через некий ApiService мы асинхронно загружаем этот самый SomeShit
                  
                  
                  
                  
                  
                  далее, после завершения процесса загрузки у нас есть два варианта - всё загрузилось и корректно распарсилось либо всё по какой-то причине сфейлилось
                  
                  
                  
                  
                  
                  соответственно, в классе модели объявлены два события
                  
                  
                  
                  
                  
                  
                  
                  
                  public event Action<SomeShit> SomeShitLoaded;
                  
                  
                  
                  
                  
                  public event Action<ErrorInfo> SomeShitLoadingFailed;
                  
                  
                  
                  
                  
                  
                  
                  
                  теперь собственно вопрос - нужно по окончанию загрузки запускать одно из этих событий в зависимости от результата выполнения запроса, но - внимание! - асинхронно, по принципу "выстрелил-забыл"
                  
                  
                  
                  
                  
                  если для этого использовать связку BeginInvoke / EndInvoke, то это фейловый путь, потому что при таком запуске обязательным условием является строго один (или ноль) подписчик у события - иначе возникнет исключение
                  
                  
                  
                  
                  
                  если запускать через просто Invoke, то это будет печально, потому что код будет явным образом ждать завершения выполнения всех методов-подписчиков события (а они, в свою очередь, также могут внутри себя вызывать другие методы модели и т.д.) - фейл, этого нужно избежать
                  
                  
                  
                  
                  
                  сейчас этот механизм реализован через отдельный класс с кучкой статических методов, внутрь которых передаётся экземпляр делегата, представляющего соответствующее событие, внутри создаётся замыкание и  запускается код вида
                  
                  
                  
                  
                  
                  
                  
                  
                  Task.Run (() => handler?.Invoke(param1, param2));
                  
                  
                  
                  
                  
                  
                  
                  
                  мне не очень нравится такой подход, и кажется, что можно это реализовать как-то более элегантно, в связи с чем вопрос - как бы вышеописанное поведение реализовали вы?
                  
                  
                
Может не совсем разобрался в юзкейсе, но почему не сделать async Task<SomeShit>, а если фейлится то генерить эксепшены?
Я предлагаю тут использовать паттерн Event Aggregator.
Сделай обработчики void async ? На первом эвейте они уйдут в другой тред (скорее всего) и эксепшен проглотится. Чем не файр энд форгет?
По-мне тут просто шина нужна.
А если делать ContinueWith и обработчик необходимого события?
Обсуждают сегодня