2

我有一个附加到 Excel 互操作组件中的事件的委托。目标是使用来自 Excel 的更新信息来更新 winforms 控件。由于我正在更改 Control 属性,因此我需要使用 Invoke:

public delegate void DataGridViewUpdate(object[,] data);

...

excel.InteractiveEdit( delegate(object[,] data) { 
    Invoke(new Common.DataGridViewUpdate(back_from_excel), new object[] { data }); 
});

...

private void back_from_excel(object[,] data) {
    // datagridview updating code
    // an exception is thrown here !
}

(此代码在我正在更新的 Form 类中,因此它正在调用this

基本上我的问题是,当方法中发生异常时back_from_excel(object[,] data),调试器不会捕获它。我知道委托在正确的 UI 线程中运行,因为我在操作表单控件时没有问题。

具体来说,当back_from_excel遇到未处理的异常时,它会在该点停止执行。应用程序的其余部分继续运行并做出响应。调试器不会暂停。输出窗格显示:

A first chance exception of type 'System.NullReferenceException' occurred in My Application.exe
A first chance exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

它没有给我任何关于哪一行导致问题的提示,只是它在 .exe 中的某个位置。

我的问题是:我做对了Invoke吗?将委托 - 调用 - 委托像这样链接在一起似乎有点奇怪,但我确实需要传递一个调用委托的委托。我的问题是在 Visual Studio 中而不是在 C# 中吗?如果是这样,我如何将调试器重新附加到该 UI 线程?

4

1 回答 1

2

“第一次机会异常”表示抛出异常,但在某个时间点被捕获。由于您将委托传递给 InteractiveEdit 方法,因此该方法可以轻松吞下委托产生的任何异常。

默认情况下,Visual Studio 只会捕获未被捕获的异常。如果要捕获所有异常,无论是否被捕获,都需要将 Visual Studio 配置为在所有异常上中断。有关如何执行此操作的详细信息,请参阅此链接。

于 2011-08-04T21:10:15.937 回答