我有一个委托附加到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
这件事吗?让委托 - Invoke - 委托链接在一起似乎有点奇怪,但我确实需要传递一个委托调用委托。我的问题是在Visual Studio中而不是在C#中吗?如果是这样,我如何将调试器重新附加到该UI线程?
答案 0 :(得分:2)
“第一次机会异常”表示抛出异常,但它在某个时刻被捕获。由于您将委托传递给InteractiveEdit方法,因此该方法可以轻松地吞下委托生成的任何异常。
默认情况下,Visual Studio将仅捕获未捕获的异常。如果要捕获所有异常,无论它们是否被捕获,您都需要配置Visual Studio以中断所有异常。有关如何执行此操作的详细信息,请参阅this link。