10

これまで特定できなかった、本当に奇妙なエラーが発生しました (非常にまれにしか発生しません)。基本的に、終了時に不明な例外をランダムにスローしていた 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 が変更されているかを知る方法はありますか? 私が明示的に行っていることではないと思います。おそらく、MS が予期していなかった操作の途中で、.NET フレームワークの基本的な状態を変更している可能性があります..

4

2 に答える 2

19

珍しい、これまでに見たことがない。Application.ExitInternal() メソッドは、Application.OpenForms コレクションを反復処理します。明らかに、このコレクションは変更中に変更されています。考えられる原因はいくつかありますが、私が思いつくのは 1 つだけです。フォームの 1 つが OnFormClosing() メソッドをオーバーライドしたか、FormClosing イベントをサブスクライブしました。そして、OpenForms コレクションを変更する何かを行っています。フォーム オブジェクトを破棄するか、新しいフォーム インスタンスを作成するか、ShowInTaskbar のようにウィンドウを再作成するフォーム プロパティを変更する可能性があります。

このコードはコール スタックにはありません。On/FormClosing コードを確認します。すぐに見つからない場合は、コードをコメントアウトしてください。

于 2011-10-27T09:57:04.533 に答える
1

この問題にも何日も費やしました...「System.InvalidOperationException」例外とアプリ (この場合、DynamSoft の twain ライブラリを使用) が発生しました。application.exit を呼び出した後に CLOSE() を呼び出すべきではなかったようです。Close をコメントアウトすると、例外がなくなり、アプリが正常に終了しました。視覚的には、アプリは 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]");
            }
于 2015-03-04T01:19:50.647 に答える