tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルApplication.Exit()処理にて例外エラーが発生
記事No11932
投稿日: 2017/11/08(Wed) 16:02
投稿者ふみぞう
Application.Exit()処理にて、例外エラーが発生するようになった。例外エラーのメッセージは、”コレクションが変更されました。列挙操作は実行されない可能性があります。”です。このプログラムは1年以上使用していて、今までは問題なく実行できていて、急に発生するようになりました。現象の原因と解決方法をお解かりの方いましたら、ご教授の程、宜しくお願い致します。

[ツリー表示へ]
タイトルRe: Application.Exit()処理にて例外エラーが発生
記事No11933
投稿日: 2017/11/08(Wed) 16:52
投稿者ふみぞう
環境の記載をしておりませんでした。
開発環境:Windows 7 Pro SP1
実行環境:Windows 7 Pro SP1
VBのバージョン:Visual Studio 2010

> Application.Exit()処理にて、例外エラーが発生するようになった。例外エラーのメッセージは、”コレクションが変更されました。列挙操作は実行されない可能性があります。”です。このプログラムは1年以上使用していて、今までは問題なく実行できていて、急に発生するようになりました。現象の原因と解決方法をお解かりの方いましたら、ご教授の程、宜しくお願い致します。

[ツリー表示へ]
タイトルRe: Application.Exit()処理にて例外エラーが発生
記事No11934
投稿日: 2017/11/08(Wed) 17:41
投稿者魔界の仮面弁士
> Application.Exit()処理にて、例外エラーが発生するようになった。
> 例外エラーのメッセージは、”コレクションが変更されました。列挙操作は実行されない可能性があります。”です。

その例外がどのコレクションを指しているか、調査はできていますか?

この例外は多くの場合、For Each の処理中に、そのコレクションの要素が
増減したことを示します。(DataTable.Rows や、Application.OpenForms など)
https://social.msdn.microsoft.com/Forums/ja-JP/444fc622-a5be-4064-874c-ebfd489fa47a?forum=vbgeneralja
https://qiita.com/kojisaiki/items/d51ec24cc30fc09e7cab

For Each 中にコレクションを増減させてしまうような処理が無いか、
また、列挙中の変数が、他のメソッドに ByRef 渡しされていないかなどを
確認してみてください。配列についても同様です。


> このプログラムは1年以上使用していて
その一年の間に、ソースコードまたは実行環境あるいは取り扱うデータなどに
何らかの変化があったのだと想像しますが、それが何であるのかは
第三者には調査できないと思います…。


それと、起動中のフォームがある場合は、Closingイベントや Closed イベントを
利用していないかどうかを確認してみてください。これらは旧式のイベントであるため、
Application.Exit 時に処理されません。(FormClosing / FormClosed は呼ばれます)


また、ワーカースレッド(BackgrundWorker など)を利用しており、かつ、
そのスレッドの稼働中に Application.Exit を呼び出す可能性がある場合は、
各スレッドの終了順序に依存するような設計になっていないかも確認してみてください。

[ツリー表示へ]
タイトルRe^2: Application.Exit()処理にて例外エラーが発生
記事No11936
投稿日: 2017/11/09(Thu) 08:23
投稿者ふみぞう
魔界の仮面弁士さん、ご返答頂き有難う御座います。

> その一年の間に、ソースコードまたは実行環境あるいは取り扱うデータなどに
> 何らかの変化があったのだと想像しますが、それが何であるのかは
> 第三者には調査できないと思います…。
>

上記の件ですが、今回例外エラーの発生したプログラムは、導入当初から変更されていません。但しソリューションの中にある別のプログラムは変更しております。最初に書かなかったのですが、該当の処理はメニュープログラムから呼び出して、処理を行いその処理が終了した時に、アプリケーション自体を終了したくて、Application.Exit()処理を使って終了させていました。現象が発生するまでは問題なくアプリケーション終了していたのですが、急に例外エラーが発生するようになりました。

> それと、起動中のフォームがある場合は、Closingイベントや Closed イベントを
> 利用していないかどうかを確認してみてください。これらは旧式のイベントであるため、
> Application.Exit 時に処理されません。(FormClosing / FormClosed は呼ばれます)
>
>
> また、ワーカースレッド(BackgrundWorker など)を利用しており、かつ、
> そのスレッドの稼働中に Application.Exit を呼び出す可能性がある場合は、
> 各スレッドの終了順序に依存するような設計になっていないかも確認してみてください。

上記の件については、頂いた情報を参考にして調査してみます。

> > Application.Exit()処理にて、例外エラーが発生するようになった。
> > 例外エラーのメッセージは、”コレクションが変更されました。列挙操作は実行されない可能性があります。”です。
>
> その例外がどのコレクションを指しているか、調査はできていますか?
>
> この例外は多くの場合、For Each の処理中に、そのコレクションの要素が
> 増減したことを示します。(DataTable.Rows や、Application.OpenForms など)
> https://social.msdn.microsoft.com/Forums/ja-JP/444fc622-a5be-4064-874c-ebfd489fa47a?forum=vbgeneralja
> https://qiita.com/kojisaiki/items/d51ec24cc30fc09e7cab
>
> For Each 中にコレクションを増減させてしまうような処理が無いか、
> また、列挙中の変数が、他のメソッドに ByRef 渡しされていないかなどを
> 確認してみてください。配列についても同様です。
>
>
> > このプログラムは1年以上使用していて
> その一年の間に、ソースコードまたは実行環境あるいは取り扱うデータなどに
> 何らかの変化があったのだと想像しますが、それが何であるのかは
> 第三者には調査できないと思います…。
>
>
> それと、起動中のフォームがある場合は、Closingイベントや Closed イベントを
> 利用していないかどうかを確認してみてください。これらは旧式のイベントであるため、
> Application.Exit 時に処理されません。(FormClosing / FormClosed は呼ばれます)
>
>
> また、ワーカースレッド(BackgrundWorker など)を利用しており、かつ、
> そのスレッドの稼働中に Application.Exit を呼び出す可能性がある場合は、
> 各スレッドの終了順序に依存するような設計になっていないかも確認してみてください。

[ツリー表示へ]
タイトルRe^3: Application.Exit()処理にて例外エラーが発生
記事No11937
投稿日: 2017/11/09(Thu) 08:54
投稿者ふみぞう
ソースコードを確認したところ、以前のプログラム修正で、メニュープログラムのFormClosingイベントにて、プログラムを呼び出す処理を追加したのですが、そのイベントがあると例外エラーが発生するようです。試しにメニュープログラムのFormClosingイベントをコメントにして確認したところ、Application.Exit()処理にて例外エラーは発生しなくなりました。メニュープログラムの処理の流れを考え直してみたいと思います。

魔界の仮面弁士さん
 頂いた情報を参考に解決できました。誠に有難う御座います。

> 魔界の仮面弁士さん、ご返答頂き有難う御座います。
>
> > その一年の間に、ソースコードまたは実行環境あるいは取り扱うデータなどに
> > 何らかの変化があったのだと想像しますが、それが何であるのかは
> > 第三者には調査できないと思います…。
> >
>
> 上記の件ですが、今回例外エラーの発生したプログラムは、導入当初から変更されていません。但しソリューションの中にある別のプログラムは変更しております。最初に書かなかったのですが、該当の処理はメニュープログラムから呼び出して、処理を行いその処理が終了した時に、アプリケーション自体を終了したくて、Application.Exit()処理を使って終了させていました。現象が発生するまでは問題なくアプリケーション終了していたのですが、急に例外エラーが発生するようになりました。
>
> > それと、起動中のフォームがある場合は、Closingイベントや Closed イベントを
> > 利用していないかどうかを確認してみてください。これらは旧式のイベントであるため、
> > Application.Exit 時に処理されません。(FormClosing / FormClosed は呼ばれます)
> >
> >
> > また、ワーカースレッド(BackgrundWorker など)を利用しており、かつ、
> > そのスレッドの稼働中に Application.Exit を呼び出す可能性がある場合は、
> > 各スレッドの終了順序に依存するような設計になっていないかも確認してみてください。
>
> 上記の件については、頂いた情報を参考にして調査してみます。
>
> > > Application.Exit()処理にて、例外エラーが発生するようになった。
> > > 例外エラーのメッセージは、”コレクションが変更されました。列挙操作は実行されない可能性があります。”です。
> >
> > その例外がどのコレクションを指しているか、調査はできていますか?
> >
> > この例外は多くの場合、For Each の処理中に、そのコレクションの要素が
> > 増減したことを示します。(DataTable.Rows や、Application.OpenForms など)
> > https://social.msdn.microsoft.com/Forums/ja-JP/444fc622-a5be-4064-874c-ebfd489fa47a?forum=vbgeneralja
> > https://qiita.com/kojisaiki/items/d51ec24cc30fc09e7cab
> >
> > For Each 中にコレクションを増減させてしまうような処理が無いか、
> > また、列挙中の変数が、他のメソッドに ByRef 渡しされていないかなどを
> > 確認してみてください。配列についても同様です。
> >
> >
> > > このプログラムは1年以上使用していて
> > その一年の間に、ソースコードまたは実行環境あるいは取り扱うデータなどに
> > 何らかの変化があったのだと想像しますが、それが何であるのかは
> > 第三者には調査できないと思います…。
> >
> >
> > それと、起動中のフォームがある場合は、Closingイベントや Closed イベントを
> > 利用していないかどうかを確認してみてください。これらは旧式のイベントであるため、
> > Application.Exit 時に処理されません。(FormClosing / FormClosed は呼ばれます)
> >
> >
> > また、ワーカースレッド(BackgrundWorker など)を利用しており、かつ、
> > そのスレッドの稼働中に Application.Exit を呼び出す可能性がある場合は、
> > 各スレッドの終了順序に依存するような設計になっていないかも確認してみてください。

[ツリー表示へ]
タイトルRe^4: Application.Exit()処理にて例外エラーが発生
記事No11938
投稿日: 2017/11/14(Tue) 21:42
投稿者shu
Application.Exitは強制終了させるよなものなので
FormClosingでの処理を行うと本来ならまだ生きているものが
解放されてしまうのでこのような現象が発生します。

Application.Exitを使わないでちゃんとすべての終了処理を
行うようにされた方がよいかと思います。

[ツリー表示へ]