Чем эти два вызова отличаются? - PullRequest
0 голосов
/ 24 ноября 2010

Я пытаюсь изменить поле со списком в моем приложении 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.

Редактировать: вот ссылка на вставку из трассировки стека. http://pastebin.com/TwfUDw4u

1 Ответ

0 голосов
/ 24 ноября 2010

this.BeginInvoke (m, new [] {oldClass, newClass});

КСТАТИ. Хорошей практикой является проверка (this.IsHandleCreated &&! This.IsDisposed) перед использованием Invoke.

...