【发布时间】:2013-12-19 07:35:02
【问题描述】:
我有一个通过 Caliburn.Micro 约定调用并引发异常的异步成员。当此成员是“Async Sub”时,异常在 Application_UnhandledException 方法中处理。当我将其更改为“异步函数”(仅返回一个任务)时,Application_UnhandledException 方法不再处理该异常。应用程序没有崩溃,异常似乎被吞没了。
通过 Caliburn.Micro 约定绑定按钮 - 点击事件绑定到 DataContext 上同名的方法。
<Button x:Name="MyMember" Content="My Button" />
异步子变体 - 引发 Application_UnhandledException
Public Async Sub MyMember()
异步函数变体 - 异常被吞下
Public Async Function MyMember() As System.Threading.Tasks.Task
documentation for Application_UnhandledException 声明它将被提升
...对于应用程序代码未处理的每个抛出的异常。
要么情况并非如此,要么调用堆栈中的某些应用程序代码更进一步处理异常 - 可能在 Caliburn.Micro 中。
this example 中似乎有类似的东西——尽管在 C# 中。
谁能解释这种行为?像这样吞下异常是个大问题。
更新: 我无法应用此信息,但它可能是相关的。 You can use Coroutine.Completed event to get your exception.
更新 2: Valeriu Caraulean 通过 Caliburn.Micro here 解决了是否使用 async void 或 async Task 的问题。他引用了 Stephen 的文章 Best Practices in Asynchronous Programming,他在其中提供了以下指导。
...你应该更喜欢 async Task 而不是 async void。异步任务方法 使错误处理、可组合性和可测试性更容易。这 本指南的例外是异步事件处理程序,它必须 返回无效。此异常包括逻辑事件的方法 处理程序,即使它们不是字面上的事件处理程序(例如, ICommand.Execute 实现)。
更新 3: 我在 Caliburn.Micro 论坛上发布了related question。
【问题讨论】:
-
请在出现这种情况的地方发布代码。您使用的是最新版本的 Caliburn.Micro 吗? v1.5 添加了对任务和
async/await的支持。行为是否发生在动作方法中? -
我已经添加了相关代码例外。不过,它只不过是方法签名而已。
-
@PanagiotisKanavos 我正在使用应该支持 axync/await 的 Caliburn.Micro 1.5.1.0。是的,上面示例中的 MyMember 成员是一个操作方法。
标签: vb.net silverlight async-await caliburn.micro