2010-11-24 2 views
0

Я пытаюсь изменить поле со списком в приложении WinForms, и я получаю странное поведение. Я пытаюсь два метода:Как эти два вызова отличаются?

Вот метод мне нужно вызвать:

private void modifyCombo(ClassInfoHolder oldClass, ClassInfoHolder newClass) { 
    this.monitoredComboBox.Items[monitoredComboBox.Items.IndexOf(oldClass)] = newClass; 
} 

Я пытаюсь два различных способа для вызова этого метода из GUI потока. Это один работает:

delegate void modifyComboCollection(ClassInfoHolder oldClass, ClassInfoHolder newClass); 

private void modifySecondTabComboBox(ClassInfoHolder oldClass, ClassInfoHolder newClass) { 
    if (monitoredComboBox.InvokeRequired) { 
     modifyComboCollection m = new modifyComboCollection(modifyCombo); 
     this.BeginInvoke(m, oldClass, newClass); 
    } else { 
     // no need for Invoke 
     modifyCombo(oldClass, newClass); 
    } 
} 

И это бросает TargetInvocationException:

this.BeginInvoke(new Action(() => { 
    modifyCombo(oldClass, newClass); 
})); 

Я бы предпочел использовать второй, потому что это гораздо яснее, но я не совсем уверен, почему он выдает ошибку, когда первый пример работает просто отлично. Первый пример вызывает метод modifyCombo и корректно возвращает IndexOf объекта. Второй пример возвращается -1 от IndexOf.

Редактировать: Здесь находится ссылка pasteshin из stacktrace. http://pastebin.com/TwfUDw4u

+3

Можете ли вы вставить полную трассировку стека исключения? TargetInvocationException обычно указывает, что какое-то исключение было выброшено в другое место, и оно было завернуто. Знание реального исключения и того, где это произошло, поможет отладить. – cdhowie 2010-11-24 17:07:13

+0

@cdhowie Добавлено; Я немного озадачен этим. – Corey 2010-11-24 17:15:50

ответ

0

это.BeginInvoke (m, new [] {oldClass, newClass});

BTW. Хорошая практика - проверить, если (this.IsHandleCreated & &! This.IsDisposed) перед использованием Invoke.

Смежные вопросы