System.InvalidOperationException из-за изменения коллекции при вызове Application.Exit () - PullRequest
8 голосов
/ 27 октября 2011

У меня действительно странная ошибка, которую я так и не смог опознать (это случается очень редко).По сути, у меня есть приложение на C #, которое случайно выдавало неизвестное исключение при выходе.Мне удалось поймать его в отладчике на этот раз, и получается, что вызов Application.Exit() вызывает System.InvalidOperationException со следующим сообщением:

Первое случайное исключение типа 'System.InvalidOperationException 'произошло в mscorlib.dll

Дополнительная информация: коллекция была изменена;Операция перечисления может не выполняться.

Я не уверен, что такое эта коллекция, которая якобы была изменена, или кто ее изменил.

Трассировка стека не очень полезна:

mscorlib.dll! System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext () + 0x13f байт System.Windows.Forms.dll! System.Windows.Forms.Application.ExitInternal () + 0x112 байт System.Windows.Forms.dll! System.Windows.Forms.Application.Exit (System.ComponentModel.CancelEventArgs e) + 0x65 байт

Любая идея, как я могуузнать, какой ArrayList был изменен?Я не думаю, что это что-то, что я делаю в явном виде, более вероятно, что я делаю действие, которое изменяет базовое состояние .NET framework во время операции, которую MS не ожидала ..

Ответы [ 2 ]

18 голосов
/ 27 октября 2011

Необычно, никогда не видел этого раньше.Метод Application.ExitInternal () выполняет итерацию коллекции Application.OpenForms.Очевидно, что эта коллекция модифицируется, пока она делает это.Есть несколько возможных причин для этого, я могу придумать только одну.Одна из ваших форм переопределила метод OnFormClosing () или подписалась на событие FormClosing.И делает что-то, что изменяет коллекцию OpenForms.Это может быть удаление объекта формы, создание нового экземпляра формы или изменение свойства формы, которое вызывает повторное создание окна, например ShowInTaskbar.

Этот код не будет найден в стеке вызовов.Просмотрите свой код On / FormClosing.Код комментария, если вы не можете быстро его найти.

1 голос
/ 04 марта 2015

Мы тоже потратили несколько дней на эту проблему ... где мы получили исключение System.InvalidOperationException и приложение (в данном случае, используя библиотеку twain от DynamSoft).По-видимому, мы не должны были вызывать CLOSE () после вызова application.exit.Комментирование закрытия привело к исключению исключения и завершило работу приложения в обычном режиме.Визуально приложение отображало бы странное окно сообщения от Microsoft, в котором говорилось бы: «Хотите представить больше информации об этой проблеме» - ЧТО ПРОБЛЕМА?до этого ничего не отображалось, поэтому мы пошли копаться в следах стека.

                Utils.Logger.Info("", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers");
                Utils.Logger.Info("Closing down application!", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers");

                // caller should close down app, added 3/3/15
                dynamicDotNetTwain2.CloseSource();
                dynamicDotNetTwain2.CloseSourceManager();

                System.Windows.Forms.Application.Exit();
no no!  don't do a close here.
                //try
                //{
                //    Close();
                //}
                //catch (Exception ex)
                //{
                //    MessageBox.Show(ex.Message + "  Routine=dynamicDotNetTwain2_OnPostAllTransfers/Close() statement failed. [EJS1503031630]");
                //}
                return;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "  Routine=dynamicDotNetTwain2_OnPostAllTransfers [EJS1503031631]");
            }
...