最近,我遇到了一個問題,我仍然頭痛不已。在一個應用程序中,我註冊了一個調度程序異常處理程序。在同一應用程序中,第三方組件(DevExpress Grid Control
)在Control.LayoutUpdated
的事件處理程序中導致異常。我期望調度程序異常處理程序被觸發一次。但是,我得到一個堆棧溢出。我製作了一個沒有第三方組件的樣本,並發現它發生在每個WPF應用程序中。如果發生DispatcherUnhandledException異常,則在Control.LayoutUpdated中發生異常之後發生堆棧溢出
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。我不能只圍繞LayoutUpdated
事件處理程序包裝try-catch
,因爲它位於第三方組件中,我不認爲應該發生堆棧溢出。
您在'OnButtonClick'中的代碼看起來非常荒謬。 – leppie
第三方組件在構造函數中註冊事件處理程序。在這個例子中,它永遠不會調用mControl。LayoutUpdated - = ThrowException,因爲之前發生堆棧溢出。 – Georg
我複製了你的代碼,並沒有得到堆棧溢出...... –