Gần đây, tôi đã gặp phải sự cố mà tôi vẫn đang phá vỡ. Trong một ứng dụng, tôi đã đăng ký một trình xử lý ngoại lệ cho trình điều phối. Trong cùng một ứng dụng, một thành phần của bên thứ ba (DevExpress Grid Control
) gây ra một ngoại lệ trong trình xử lý sự kiện cho Control.LayoutUpdated
. Tôi mong đợi, rằng xử lý ngoại lệ dispatcher được kích hoạt một lần. Nhưng thay vào đó, tôi nhận được một tràn ngăn xếp. Tôi đã tạo ra một mẫu không có thành phần của bên thứ ba và được phát hiện, rằng nó xảy ra trong mọi ứng dụng WPF.Ngăn xếp tràn sau khi ngoại lệ trong Control.LayoutCập nhật nếu DispatcherUnhandledException được đăng ký
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();
}
}
}
Có cách nào để ngăn chặn hành vi này không? Nó xảy ra với .NET framework 3.0, 3.5, 4.0 và 4.5. Tôi không thể chỉ quấn try-catch
xung quanh trình xử lý sự kiện LayoutUpdated
vì nó nằm trong thành phần của bên thứ ba và tôi không nghĩ rằng xảy ra tràn ngăn xếp.
Mã của bạn trong 'OnButtonClick' trông rất vô nghĩa. – leppie
Thành phần của bên thứ ba đăng ký trình xử lý sự kiện trong hàm tạo. Trong mẫu này, nó sẽ không bao giờ gọi mControl.LayoutUpdated - = ThrowException vì tràn ngăn xếp xảy ra trước đó. – Georg
Tôi đã sao chép mã của bạn và không nhận được tràn ngăn xếp ... –