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 и обработчик необходимого события?
Обсуждают сегодня