5

SmartClientがC#に組み込まれており、実行中のPCが再起動されても頑固に開いたままになります。これにより、ユーザーが最初にSmartClientを閉じるか、他の手動による介入がない限り、再起動プロセスが停止します。

これは、インフラストラクチャチームがマシンの再起動を必要とする新しいソフトウェアをリモートでインストールするときに問題を引き起こします。

SmartClientアプリにWindowsからのシャットダウン/再起動イベントを認識させ、正常に自殺させるためのアイデアはありますか?

更新: これは、複数のGUIスレッドを備えた高度にスレッド化されたアプリケーションです。はい、複数のGUIスレッド。それ自体がスタンドアロンアプリケーションである可能性のある多くのプロジェクトの実際の統合です。これらはすべて、これらの管理方法を一元化し、スレッドを追跡する単一のexeから起動および管理されます。バックグラウンドスレッドを使用することはオプションではないと思います。

4

6 に答える 6

5

アプリケーションが閉じないように実行を継続するスレッドである必要があります。スレッドを使用している場合、簡単な修正はそれをバックグラウンドに設定することです。

スレッドは、バックグラウンドスレッドまたはフォアグラウンドスレッドのいずれかです。バックグラウンドスレッドは、バックグラウンドスレッドがプロセスの終了を妨げないことを除いて、フォアグラウンドスレッドと同じです。プロセスに属するすべてのフォアグラウンドスレッドが終了すると、共通言語ランタイムはプロセスを終了します。残りのバックグラウンドスレッドはすべて停止され、完了しません。

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

于 2008-10-03T18:55:19.270 に答える
5

OK、アプリにアクセスできる場合は、SessionEndedイベントを処理できます。

...
Microsoft.Win32.SystemEvents.SessionEnded +=new
  Microsoft.Win32.SessionEndedEventHandler(shutdownHandler);

...

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
  // Do stuff
}
于 2008-10-03T18:58:27.873 に答える
5

ユーザーがログオフするか、Windows がシャットダウンされると、WM_QUERYENDSESSIONメッセージはすべての最上位ウィンドウに送信されます。こちらの MSDN ドキュメントを参照してください。

このメッセージに対する WinForm アプリケーションのデフォルトの動作は、またはその他のFormClosingイベントをトリガーすることです。CloseReason == WindowsShutDownただし、イベント ハンドラーは頑固であることを選択して、アプリのシャットダウンを拒否することで、システムを実行し続けることができます。

FormClosingアプリケーションのハンドラを確認してください。多分そこに何かがある。私はこの種のものを数回見ました。

于 2008-10-03T19:27:11.593 に答える
1

または、.Netアプリが意図的にメッセージの終了または終了を無視している可能性がありますか?

于 2008-10-03T18:52:41.520 に答える
1

バックグラウンド スレッドは手っ取り早い解決策でした。最善の解決策は、同期オブジェクト (ManualResetEventなどMutex) を使用して他のスレッドを停止することです。

WM_CLOSEまたは、開いているすべてのウィンドウと、メイン アプリを閉じたときに送信されたメッセージを追跡します。

これらの GUI アプリケーションをどのように開始するかについて、より多くの情報を提供する必要があります。たぶん、アプリケーションごとに 1 つのスレッドを開始して呼び出しApplication.Run(new Form1());ますか?

AppDomain各 GUI アプリケーションの作成を検討することもできます。

于 2008-10-03T19:09:07.167 に答える
0

通常、.Netアプリは正しく応答します-少なくとも、それは「すぐに使える」動作です。そうでない場合は、さまざまなことが起こっている可能性があります。プログラムについて何も知らなくても、メインUIスレッドで長時間実行されているプロセスがあり、アプリがウィンドウメッセージに応答するのを妨げていると思います。

于 2008-10-03T18:49:00.373 に答える