У меня есть делегат, который прикреплен к событию в компоненте взаимодействия Excel. Цель состоит в том, чтобы обновить элемент управления winforms обновленной информацией из Excel. Поскольку я меняю свойства 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)
, отладчик не перехватывает его. Я знаю, что делегат работает в правильном потоке пользовательского интерфейса, потому что у меня нет проблем с управлением элементами формы
В частности, случается, что когда 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 #? Если да, то как мне снова подключить отладчик к этому потоку пользовательского интерфейса?