none
Shutdown時にアプリが終了しない RRS feed

  • 質問

  • 今、あるアプリのメンテナンスをしていますが、Shutdown時にアプリが終了しないという問題が起きています。

    動作環境: Windows7
    開発環境: Visual Stdio 2015(C#)

    右上の×ボタンでは、問題無くアプリが終了するのですが、Windows のShutdownでは、アプリが終了せず、エラーとなっています。
    (アプリ終了後のShutdownも見かけ上、問題無い)

    複数のスレッド、タスクを起動しているのでそれが原因かと思っているのですが、Shutdown時のみ正しく終了しない原因が分かりません。こういう場合、どの辺を調べたら、良いか情報がありましたら、教えていただきたいと思っています。

    少ない情報で申し訳ないのですが、中身を全て把握している状況で無いため、手探り状態となっています。

    よろしくお願いします。

    2018年1月20日 13:54

回答

  • How to simulate Windows shutdown for debugging?でいいデバッグ手順が提示されていました。

    The OEM Ready Program and RMTool.exeで紹介されているRMTool.exeを使用することで指定のプロセスだけに対してシャットダウンのシミュレーションができるそうです。対象のアプリでデバッグを開始しておき、このツールを使ってシャットダウンしたように見せかけてみてはどうでしょうか。うまくいけば問題個所で停止もしくはハングアップするはずですので、そこから調査してください。

    • 回答としてマーク pepperleaf01 2018年1月22日 12:25
    2018年1月21日 8:08
  • 標準インストールなら c:¥Program Files (x86)¥Windows Kits¥10¥App Certification Kit に rmlogotest.exe 学習あるはず。
    あ、7で2015か。Windows App Certification Kit を検索してインストール。佐祐理さんのURLの回答の下のコメントの「this link」

    Jitta@わんくま同盟

    • 回答としてマーク pepperleaf01 2018年1月22日 12:25
    2018年1月22日 5:22
  • 知っている例を1つ。
    Control.Invoke は相手先に送れないと例外が発生することになっていますが、タイミング次第では何も起きず、永久待ちになることがあります。
    これは Control.Invoke を使っている限り、避けられません。
    • 回答としてマーク pepperleaf01 2018年1月27日 0:55
    2018年1月25日 14:03
    モデレータ

すべての返信

  • 「エラーとなっている」とはどういった観測結果をもとに発言されていますか?
    例外ダイアログが表示されるのか、自作のエラーログなのか、シャットダウン時に応答しないプログラムと表示されるのか。
    あいまいな表現ではなく、具体的にしてください。
    2018年1月20日 21:05
    モデレータ
  • 説明不足で申し訳ありません。

    > シャットダウン時に応答しないプログラムと表示される

    です。

    2018年1月21日 2:15
  • そうであれば、FormClosing イベントでキャンセルしているか、例外が出ているか、2-3 秒程度といった時間内に処理を終えていないか、メインスレッドが応答していないかということでしょう。

    それ以上は、プログラム固有の問題なので回答は難しいでしょう。

    2018年1月21日 2:27
    モデレータ
  • FormClosing イベントについては、終了時の後始末でキャッチしていますが、キャンセルせずに終了しています。 (Shutdownから、呼び出されている事までは確認済みです)  FormClosedイベントには来ていないようです。(当然かもしれませんが)

    > 例外が出ているか、2-3 秒程度といった時間内に処理を終えていないか

    こちらについては不明ですが、通常の終了処理は (見かけ) 2,3 秒もかかっていないように見えます。大抵のプログラムでは、数秒掛かっても待てば、Shutdownに移行していたと思いますが、数十秒放置しても変化無し。

    例外処理については、デバッグ実行で発生しているのは確認していますが、キャッチし、無視する処理を内部で行っています。 (こちらも消したいが、追い切れていない)

    > メインスレッドが応答していないかということでしょう。

    こちらについて、確認する方法はあるでしょうか?

    今回の件について、プログラム固有の問題という認識はありますが、何か手掛かりは無いかと思った次第です。

    2018年1月21日 7:40
  • How to simulate Windows shutdown for debugging?でいいデバッグ手順が提示されていました。

    The OEM Ready Program and RMTool.exeで紹介されているRMTool.exeを使用することで指定のプロセスだけに対してシャットダウンのシミュレーションができるそうです。対象のアプリでデバッグを開始しておき、このツールを使ってシャットダウンしたように見せかけてみてはどうでしょうか。うまくいけば問題個所で停止もしくはハングアップするはずですので、そこから調査してください。

    • 回答としてマーク pepperleaf01 2018年1月22日 12:25
    2018年1月21日 8:08
  • 佐祐理さん、ありがとうこざいます。

    早速、と思ってリンクを見たのですが、 肝心の RMTool.exe がリンク切れとなっていました。
    検索したころ、MSサイトは紹介ページしか見つかりません。 (よく分からないサイトはありましたが)

    便利なツールと思ったのですが、残念です。

    2018年1月21日 9:20
  • 標準インストールなら c:¥Program Files (x86)¥Windows Kits¥10¥App Certification Kit に rmlogotest.exe 学習あるはず。
    あ、7で2015か。Windows App Certification Kit を検索してインストール。佐祐理さんのURLの回答の下のコメントの「this link」

    Jitta@わんくま同盟

    • 回答としてマーク pepperleaf01 2018年1月22日 12:25
    2018年1月22日 5:22
  • ありがとうございます。

     ...\10\App... でなく、 \8.1\App... の下にありました。

    デバック実行したところ、

    通常の 右上の ×ボタンの場合、
    Closing() からのステップ実行 (F10)では、Closed()になりましたが、

    rmlogtest.exe による停止の場合、
    複数のTimer処理を繰り返すのみでした。

    問題の解決までは至りませんが、デバッグの糸口が見つかった事に感謝します。
    (現状、すぐに解決しないという事で、プライオリティが下がっています)


    2018年1月22日 12:25
  • Application.Current.SessionEnding イベントを受けて見たら?

    Jitta@わんくま同盟

    2018年1月23日 3:36
  • > Application.Current.SessionEnding イベントを受けて見たら?

    ありがとうございます。
    時間を見つけて確認してみます。

    2018年1月23日 6:28
  • 一応、書いておきます。

    WPFのプロジェクトを作り、System.Timers.Timerを使って定期的に表示を更新するテストプログラムを作りました。これに RMLogTest.exe で終了メッセージを送ったところ、期待通りにすべて終了しました。

    スレッドの作り方、終了のさせ方、3つのTimerのうちどれを使ったか。結構重要な情報かと思います。


    Jitta@わんくま同盟

    2018年1月24日 12:46
  • Jittaさん、確認ありがとうございます。

    今、作業しているが、Windowsフォームアプリとなります。 Application.Current.SessionEnding イベント を調べてみたのですが、使い方が分かりませんでした。 ただ、rmlogotest を使う事で、デバッガ上で 動作確認できるようになり、助かっています。

    スレッド、タイマが終了していないのはどうも確かなようです。それが既に終了した Windowにメッセージ(?) を送ろうとして、それが失敗しているらしい事まで分かりました。 (なぜ、右上の×なら、OKなのか?)
    Closingの時、動いているスレッドを強制停止したところ、別のところでエラーが発生する状況。地道に追いかけるしかない状況です。

    2018年1月25日 13:58
  • 知っている例を1つ。
    Control.Invoke は相手先に送れないと例外が発生することになっていますが、タイミング次第では何も起きず、永久待ちになることがあります。
    これは Control.Invoke を使っている限り、避けられません。
    • 回答としてマーク pepperleaf01 2018年1月27日 0:55
    2018年1月25日 14:03
    モデレータ
  • > Control.Invoke は相手先に送れないと例外が発生することになっていますが、タイミング次第では何も起きず、永久待ち

    この可能性大です。 rmlogtest.exe で動作確認中に、それらしきエラーログを見ています。
    実際、起動しているタイマーとかの処理は、作成元の処理を呼び出しているので、 Invoke, BeginInvoke が多用されています。 さて原因は分かったのですが、対応としては、終了時に適切な順序で、スレッド/タスクを終了するという当たり前の事しかなさそうですね。

    情報、ありがとうこざいました。

    2018年1月27日 1:03