C# 调度程序未引发未处理的异常事件
我的情况是,调度器不会引发C# 调度程序未引发未处理的异常事件,c#,wpf,exception,exception-handling,dispatcher,C#,Wpf,Exception,Exception Handling,Dispatcher,我的情况是,调度器不会引发UnhandledException事件,也不会引发UnhandledExceptionFilter事件 但据我所知,当我在Invoke中遇到异常时,它应该会引发这些事件 这是我的最小无效示例: [Test] public void Should_raise_unhandled_exception_event() { var control = new Canvas(); var window = new Window { Content = contr
UnhandledException
事件,也不会引发UnhandledExceptionFilter
事件
但据我所知,当我在Invoke
中遇到异常时,它应该会引发这些事件
这是我的最小无效示例:
[Test]
public void Should_raise_unhandled_exception_event()
{
var control = new Canvas();
var window = new Window { Content = control };
window.Show();
control.Dispatcher.UnhandledExceptionFilter += (s, e) =>
{
Debug.WriteLine("filter unhandled exception");
Debug.WriteLine("e.RequestCatch: {0}", e.RequestCatch);
};
control.Dispatcher.UnhandledException += (s, e) =>
{
Debug.WriteLine("unhandled exception: {0}", e.Exception);
e.Handled = true;
};
control.Dispatcher.Invoke(() => { throw new ArgumentOutOfRangeException(); });
window.Close();
}
我的事件处理程序都没有被调用。
我不明白为什么。有人能解释一下吗?如果调用
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException),会发生什么情况代码>在测试方法开始时?这来自表单
-命名空间。我有一个WPF应用程序。为什么要使用control.Dispatcher
而不是Application.Current.Dispatcher
?因为我在进行单元测试。在实际应用中,它们是相同的实例。所以我用哪一个都不重要。那个文档非常不准确。不,当您使用Invoke时,异常会被封送回调用它的线程。这将永远不会导致引发未处理的异常事件,线程错误。当您使用BeginInvoke时,将在UI线程上引发异常,并且您将获得该事件。无法使用单元测试模拟此行为,需要Application.Run()。如果调用Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException),会发生什么情况代码>在测试方法开始时?这来自表单
-命名空间。我有一个WPF应用程序。为什么要使用control.Dispatcher
而不是Application.Current.Dispatcher
?因为我在进行单元测试。在实际应用中,它们是相同的实例。所以我用哪一个都不重要。那个文档非常不准确。不,当您使用Invoke时,异常会被封送回调用它的线程。这将永远不会导致引发未处理的异常事件,线程错误。当您使用BeginInvoke时,将在UI线程上引发异常,并且您将获得该事件。无法使用单元测试模拟此行为,需要Application.Run()。