【发布时间】:2019-10-30 02:16:30
【问题描述】:
我的视图<Button Content="Search" cal:Message.Attach="SearchAsync"/> 中有一个按钮,它调用了一个引发异常的函数。我正在尝试使用
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
e.Exception.Log();
}
- 如果函数看起来像这样:
public async Task SearchAsync()错误就被吞没了,永远不会到达 OnUnhandledException, - 如果函数如下所示:
public async void SearchAsync()它会引发异常,但调试器会停止并等待我在 void 函数中按 continue,我需要为每个 Task 函数创建一个 void 函数,并且 - 如果我使用AsyncReactiveCommand,它能够在 OnUnhandledException 中捕获异常,但再次使用命令会产生额外代码 (
SearchCommand = new AsyncReactiveCommand().WithSubscribe(async () => await SearchAsync());)。
据我所知,async void 应该用于操作,因为它们是事件处理程序(source)。
我想出的解决方案是:要么使用命令,要么将任务函数包装在 try/catch 中,这两种方法我都不太满意。
在 Caliburn.Micro 中使用 async 和 await 并仍然使用 cal:Message.Attach="xyz" 语法的正确方法是什么?
最好我想使用异步任务语法而不使用其他任何东西,因为它提供了最好的测试能力并且需要最少的代码。
【问题讨论】:
-
它抛出一个未处理的异常并且 UI 崩溃。 你确定它不只是中断,如果你有一个调试器,这是标准行为,参考 this评论。继续执行(按 F5)应该会让你通过。
-
你说得对,我忽略了我可以继续,但这对我来说仍然不合适。我编辑了问题。
-
这可能是因为它不是为了感觉正确。例外适用于例外情况,它们不应用于常规程序流程。
-
你是对的,但我仍然想在某个时候以最方便的方式捕获每个异常。换句话说,我想使用异步任务,而不是为我的 UI 调用函数编写包装器方法。
标签: c# wpf async-await caliburn.micro