最近,我遇到了一个问题,我仍然很头疼。在一个应用程序中,我注册了一个调度程序异常处理程序。在同一个应用程序中,第三方组件 ( DevExpress Grid Control
) 在Control.LayoutUpdated
. 我希望调度程序异常处理程序被触发一次。但相反,我得到了堆栈溢出。我制作了一个没有第三方组件的示例,并发现它发生在每个 WPF 应用程序中。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace MyApplication
{
/* App.xaml
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyApplication.App"
Startup="OnStartup"
/>
*/
public partial class App
{
private void OnStartup(object sender, StartupEventArgs e)
{
DispatcherUnhandledException += OnDispatcherUnhandledException;
MainWindow = new MainWindow();
MainWindow.Show();
}
private static void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
e.Handled = true;
}
}
public class MainWindow : Window
{
private readonly Control mControl;
public MainWindow()
{
var grid = new Grid();
var button = new Button();
button.Content = "Crash!";
button.HorizontalAlignment = HorizontalAlignment.Center;
button.VerticalAlignment = VerticalAlignment.Center;
button.Click += OnButtonClick;
mControl = new Control();
grid.Children.Add(mControl);
grid.Children.Add(button);
Content = grid;
}
private void OnButtonClick(object sender, RoutedEventArgs e)
{
mControl.LayoutUpdated += ThrowException;
mControl.UpdateLayout();
mControl.LayoutUpdated -= ThrowException;
}
private void ThrowException(object sender, EventArgs e)
{
throw new NotSupportedException();
}
}
}
有什么办法可以防止这种行为?它发生在 .NET 框架 3.0、3.5、4.0 和 4.5 上。我不能只包装事件处理程序try-catch
,LayoutUpdated
因为它位于第三方组件中,而且我认为不应该发生堆栈溢出。