在我的应用程序 (.NET 4.0) 中,我使用 smartassembly 通过自定义模板进行错误报告。它安装了两个处理程序:
- 它安装了一个全局异常捕获器,并在发生异常时调用我的自定义代码。在那里我显示了一个 WPF 窗口,其中显示了异常的详细信息并允许用户通过 Internet 发送数据。
- 如果发生 #1 无法处理的异常,它会调用致命异常处理程序。我在消息框中输出异常数据。
在一个客户的机器(Windows XP、.NET 4.0)上,应用程序启动后,他从#2 收到一条错误消息。然后应用程序被终止:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
at System.Windows.Threading.Dispatcher.VerifyAccess()
at Exapt.ErrorReporting.ErrorReportView..ctor()
at Exapt.ErrorReporting.ExaptUnhandledExceptionHandler.OnReportException(ReportExceptionEventArgs e)
at SmartAssembly.SmartExceptionsCore.UnhandledExceptionHandler.ReportException(Exception exception, Boolean canContinue, Boolean manuallyReported)
相关代码:
public ExaptUnhandledExceptionHandler : UnhandledExceptionHandler
{
protected override void OnReportException(ReportExceptionEventArgs e)
{
var view = new ErrorReportView();
view.DataContext = new ErrorReportViewModel(this, e, view);
view.ShowDialog();
}
}
public ErrorReportView : Window
{
public ErrorReportView()
{
this.InitializeComponent();
// EDIT
if (Application.Current != null)
this.Owner = Application.Current.MainWindow;
// END EDIT
}
}
所以会发生以下情况:
- 在启动期间发生异常(不幸的是,这会丢失)。
- 为了处理异常,smartassembly 调用处理程序#1,OnReportException()。
- 在那里我创建了一个新的 ErrorReportView。
- WPF 在构造函数中抛出跨线程异常(之前
InitializeComponent()
)! - 因为在处理异常时发生了异常,所以 smartassembly 调用处理程序 #2 并终止应用程序。
一个简单的 new Window() 怎么可能导致自身发生跨线程异常?