Поскольку действие является асинхронным. loadBranch()
возвращается, как только будет достигнут первый await
, и невозможно выполнить исключение, которое вы ожидаете - это часть информации в Task
, которую вы проигнорировали (используя Action
вместо Func<Task>
).
В общем, вы только что написали более затемненный версию этого:
_branchClient.ReadOneItemAsync(AppSettings.BranchId, _initCts.Token);
.NET Конструкторы по своей сути синхронными. Они не должны делать ничего, где вам будет полезно использовать асинхронный код, - и это хорошая идея сделать как можно меньше в конструкторе (или методах, вызываемых конструктором). Если вам нужны сложные действия, асинхронный код, ввод-вывод, много работы центрального процессора ... используйте статический метод. И так как вы используете асинхронный код, сделайте его возвратом Task<AppStateModel>
, подходящим для всего асинхронного потока.
Также обратите внимание, что исключение будет не быть проглоченным при старших времени выполнения .NET. Предполагая, что контекст синхронизации не существует, исключение все равно бросается в фоновый поток (где отправляется продолжение на асинхронную операцию) - и по умолчанию для необработанных исключений в потоках потоков потоков используется «приведение всего приложения». Это произойдет, когда объект Task
будет завершен, поэтому он будет отделен от всей вашей логики программы, в значительной степени случайной, насколько вы можете судить. В конце концов, что еще вы можете сделать - нет хорошего места, где исключение можно было бы наблюдать, и единственный корень там когда-либо был в основном сказал: «Меня не волнует, что происходит с этой задачей». Но с учетом того, насколько сложно было гарантировать, что каждое исключение должным образом соблюдается и обрабатывается, значение по умолчанию было изменено на «незаметные исключения игнорируются».
Потому что это 'async'? 'loadBranch()' возвращается в 'await', если' _branchClient.ReadOnItemAsync() 'еще не завершен. Таким образом, конструктор успешно возвращается. –
Почему вы пытаетесь вызвать метод async в конструкторе? Конструкторы не должны выполнять никаких сложных операций. Почему бы не использовать статический метод вместо этого? Это может быть обычным асинхронным методом без какой-либо этой глупости :) – Luaan
@ Luaan Это просто быстро и грязно, пока я не закончу свою текущую историю, тогда у меня есть еще одна задача на доске, чтобы покончить с глупостью. Мне не нужно знать, как заставить его работать, потому что я никогда не сделаю такого в конечном коде. Я просто спрашиваю, потому что мне любопытно. – ProfK