【发布时间】:2013-12-12 11:26:20
【问题描述】:
我在一个测试应用程序中应用了这些处理程序:
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
然后我在表单上的嵌套任务/异步等待上创建一个异常:
尽管处理程序被触发 - CurrentDomain.UnhandledException - 应用程序仍然崩溃。
为什么会崩溃,不显示对话框并继续运行?
System.Exception 未处理 消息:mscorlib.dll 中出现“System.Exception”类型的未处理异常 附加信息:dd
private async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Main " + Thread.CurrentThread.ManagedThreadId);
try
{
await Hello();
}
catch (Exception ex)
{
Console.WriteLine("Exception on main " + Thread.CurrentThread.ManagedThreadId);
}
}
private async static Task Hello() //changed from void
{
await Task.Run(() => new IGetRun().Run1());
}
internal class IGetRun
{
public async Task Run1() //changed from void
{
Console.WriteLine("Run1 " + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() => new IGetRun2().Run2());
}
}
internal class IGetRun2
{
public void Run2()
{
Console.WriteLine("Run2 " + Thread.CurrentThread.ManagedThreadId);
throw new Exception("dd");
}
}
编辑:
看起来我忘了用 Task 声明每个异步方法而不是 void 因此异常处理现在可以预测。我唯一不知道的是为什么 - 如果我停止处理按钮事件中的异常 - 当异常被捕获时 Application_ThreadException 被触发而不是 TaskScheduler_UnobservedTaskException
【问题讨论】:
-
@JMK 这不能充分回答我的问题
-
因此使用了“潜在”这个词
-
@JMK 假设您投票结束我的问题,我错了吗?
-
我注意到您在代码中使用线程的位置,并认为这可能与在一个线程中抛出的异常而不是在另一个线程中被捕获有关,这是常见的问题,因此投票接近。没有其他人投票关闭,所以看起来我错了
标签: c# winforms async-await