- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 App.xaml.cs
中,我创建了一个处理程序来响应 AppDomain.CurrentDomain.UnhandledException事件。
在处理程序中,我需要调用一个异步方法来发送有关错误的电子邮件报告。所以我在等待这个方法,在里面我在等待Net.Mail.SmtpClient.SendMailAsync() .
但这不起作用——当控件到达第二个等待时(就在实际发送之前),应用程序退出。
当我摆脱所有异步并使用同步替代方案时,Net.Mail.SmtpClient.Send() , 电子邮件被正确发送。
处理程序中似乎没有抛出其他异常。此外,它似乎不仅仅是 Visual Studio Debug模式问题。
是否无法在 UnhandledException 处理程序中成功调用异步方法?
更新:
我的处理程序方法的签名如下所示:
private async void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e);
然后我将处理程序附加到 App
的构造函数中的事件,如下所示:
App()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
最佳答案
事件总是void
。这意味着如果你想使用await
,你必须使用async void
。这就是您在此处看到的问题的原因。
当 await
作用于未完成的 Task
时,该方法的其余部分将在等待后安排完成,并返回。通常它会返回调用者可以等待的 Task
,但由于返回类型是 void
,因此它什么也不返回。调用者不能等待它,即使它想要。通常这不是事件的问题,因为事件只是“某事”发生的通知,触发事件的任何事情都不依赖于事件处理程序内部发生的任何事情。
但在这种情况下,框架会在事件处理程序返回后继续关闭应用程序。因此,由于 await
返回,应用程序关闭而无需等待任务实际完成。
最好的解决方案是让事件处理程序中的所有内容保持同步。这将防止它在您预期之前返回。
“保持一切同步”是指实际使用同步方法(如 Net.Mail.SmtpClient.Send()
)。不要在异步方法上同步等待,因为 can cause deadlocks .
关于c# - 不会等待从 UnhandledException 处理程序调用的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59216548/
我正在调查奇怪的 WPF 多线程应用程序挂起,这种挂起在生产机器上比在开发机器上更容易随机发生。 我添加了 Application.Dispatcher.UnhandledException 和 Cu
如题。 我一直在谷歌搜索并阅读 threads ... 我很确定没有其他地方可以使用 e.Handle 来阻止异常冒泡到 UnhandledException 处理程序。 我测试我的代码如下: 应用程
我有一个应用,尽管存在以下处理程序,但有时会意外终止 AppDomain.CurrentDomain.UnhandledException,Application.Current.Dispatcher
根据 Microsoft 文档,当线程(来自线程池或使用 System.Threading.Thread 类创建)发生未处理的异常时,应为应用程序的默认 AppDomain 触发 AppDomain.
我正在编写一个小库来捕获所有未处理的异常,显示一个小对话框(类似于 NF 的常用对话框),让用户有机会将异常发送给开发人员。为此,我像这样使用 AppDomain 的 UnhandledExcepti
我们有一个 .NET 3.5 程序集 (dll),由 VB6“代理”(exe) 通过 COM 接口(interface)执行。 VB6 代码调用: ' Ensure that no system di
我在全局范围内捕获异常并且它工作正常,除了应用程序在 UnhandledExceptions 上没有恢复的部分。 . 我在 MSDN 上读过,为了允许调度程序异常捕获未处理的非 UI 异常,我需要做以
我试图在我的应用程序中捕获所有未处理的异常,以便有条件地处理那些可以在不终止应用程序的情况下发生的异常,但我无法解决一个非常基本的问题:它不会停止异常。代码中某处抛出未处理的异常,它出现在这里,显示消
在我的应用程序中,每当出现任何未处理的异常时,我都想显示一个消息对话框。但是似乎在抛出未处理的异常时没有出现对话框消息,显示消息弹出窗口是否有效?同样在 MSDN 文档中,我没有找到太多相关信息。 下
我目前正在开发一个完全模块化的 .NET 应用程序,其中: 有加载模块 DDL 的主机应用程序。模块 DDL 具有可以多次打开的形式。 您可以卸载应用程序域。这将导致模块的所有打开形式被关闭。 我想做
在我的 App.xaml.cs 中,我创建了一个处理程序来响应 AppDomain.CurrentDomain.UnhandledException事件。 在处理程序中,我需要调用一个异步方法来发送有
我正在使用 AppDomain 提供的 UndhandledException,我所做的基本上是这样的: static void Main(string[] args) { AppDo
建议的重复是关于DispatcherUnhandledException,而不是AppDomain.CurrentDomain.UnhandledException。 原创: 应该在哪里订阅AppDo
我有一个非常简单的线程。 Thread 对象所做的唯一事情就是throw new Exception();。我这样做的原因是因为我需要测试如果异常发生在我的应用程序的单独线程中会发生什么。我已经用“真
在下面的代码片段中,为什么在单元测试中抛出异常时附加的处理程序(AppDomain.CurrentDomain.UnhandledException 事件)不会启动? 我在 VS2010 上使用 NU
情况 好吧,正如您在下面看到的,我有一个主应用程序,它创建了一个线程,它创建了一堆后台 worker 。当 RunWorkerCompleted 在某些 BG worker 上被触发时,我有时最终会丢
我有一个带有绑定(bind)到 Application.CurrentDomain.UnhandledException 的事件处理程序的 .NET 程序。 运行带有调试的程序时,当抛出未处理的异常时
由于未处理的 XAML 异常,有时会引发我的应用程序中的 UnhandledException 处理程序。 UnhandledExceptionEventArgs 包含消息 E_RUNTIME_SET
我正在尝试创建一个 AppDomain 并从 F# 附加到它的 UnhandledException 事件,但我运气不佳。在我的事件处理程序中,我需要对触发事件的域以及事件参数的引用。 要重现此问题,
当 AppDomain 有未处理的异常时,您可以处理 AppDomain.CurrentDomain.UnhandledException 事件。 但是,您无法阻止 AppDomain 关闭。你不能只
我是一名优秀的程序员,十分优秀!