У меня есть кнопка в моем представлении <Button Content="Search" cal:Message.Attach="SearchAsync"/>
, которая вызывает функцию, которая вызывает исключение.Я пытаюсь перехватить это исключение в моем классе Bootstrapper с помощью
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
e.Exception.Log();
}
- Если функция выглядит следующим образом:
public async Task SearchAsync()
ошибка просто проглатывается и исключение OnUnhandledException никогда не достигается, - если функция выглядит следующим образом:
public async void SearchAsync()
она выдает исключение, но отладчик останавливается и ждет, пока я нажму "продолжить" в функции void, и мне нужно создать функцию void для каждой функции Task и - если я использую AsyncReactiveCommand , он может перехватить исключение в OnUnhandledException, но использование команды снова приводит к дополнительному коду (
SearchCommand = new AsyncReactiveCommand().WithSubscribe(async () => await SearchAsync());
).
Насколько я понялasync void следует использовать для действий, потому что они являются обработчиками событий (источник) .
Решения, которые я придумала, таковы: либо используйте команду, либо оберните функцию Task в try / catchЯ не очень доволен этим.
Как правильно работать с асинхронным режимом и ждать в Caliburn.Micro и при этом использовать cal: Message.Attach = "xyz" синтаксис?
Предпочтительно я хотел бы использовать синтаксис асинхронной задачи без чего-либо еще, потому что он обеспечивает наилучшую возможность тестирования и требует наименьшего количества кода.