プロセスを開始してこのプロセスを閉じたい場合、Process.Close()
とProcess.Kill()
の違いは何ですか?
Wiresharkを使用して、Windows = hidden
のコマンドライン経由のコマンドでパケットのキャプチャを開始するアプリケーションがあるため、私は尋ねました。そのため、キャプチャを停止したい場合はプロセスを強制終了します。そのため、最後のパケットが途中で切断されたというエラーでキャプチャが開くことがあるため、close()
の前にkill()
を使用できますこの問題を解決しますか?
キャプチャを開始したら、Ctrl + Cを押して閉じることができますが、私の場合は非表示の状態でウィンドウを開きます。コードを使用して同様の操作を実行できますか?
Process.Close()
とprocess.Kill()
の違いは何ですか?
マニュアルはそれについてかなり明確です:
Closeメソッドは、プロセスが待機していた場合に終了の待機を停止し、プロセスハンドルを閉じ、プロセス固有のプロパティをクリアします。 Closeは、標準出力、入力、およびエラーリーダーとライターが外部で参照されている場合、それらを閉じません。 [すなわちプロセス自体は実行を続けますが、
Process
インスタンスを使用してそれを制御することはできません。
Killはプロセスを強制的に終了しますが、CloseMainWindowは終了のみを要求します。 [...] CloseMainWindowを呼び出してプロセスを終了する要求は、アプリケーションを強制終了しません。アプリケーションは、終了する前にユーザーの確認を求めることも、終了を拒否することもできます。アプリケーションを強制終了するには、Killメソッドを使用します。 CloseMainWindowの動作は、システムメニューを使用してアプリケーションのメインウィンドウを閉じるユーザーの動作と同じです。したがって、メインウィンドウを閉じてプロセスを終了する要求は、アプリケーションをすぐに強制終了しません。
閉じるメッセージをメインウィンドウに送信して、ユーザーインターフェイスを持つプロセスを閉じます。
編集に関して:
私が尋ねたのは、Windows =非表示のコマンドラインを介してコマンドでwiresharkを使用してパケットをキャプチャし始めるアプリケーションがあるためです。
WinPcap APIを使用 または そのためのPcap.Netライブラリ 、Wiresharkではありません。
Kill
は、systemにプロセスを不意に終了するように要求します(Windowsへの呼び出しを介して TerminateProcess システムコール) 。これは、タスクマネージャーのプロセスの終了に似ています。
Close は、.NETのプロセスへのハンドルを閉じますが、実際にはプロセス自体には触れません。 Close
は、Dispose
によっても呼び出されます。 Jon Skeetによる this answer を参照してください。
3番目のオプションは CloseMainWindow です。これは、doesプライマリウィンドウに閉じるように要求することにより、プログラムを正常にシャットダウンします。これは、タスクバーでプログラムを右クリックして[閉じる]を選択するのと似ています。
KillとCloseは2つのオプションではありません。プロセスを終了する場合は、Kill(またはCloseMainWindow)を呼び出す必要があります。 Closeを呼び出すとリソースが解放されますが、標準ストリームは閉じられません。自分でストリームを閉じると、プロセスが終了する場合と終了しない場合があります。プロセスによって異なります。最善の戦略は、プロセスのタイプに応じてKillまたはCloseMainWindowを呼び出してから、Processオブジェクトを破棄することです。
Close Processオブジェクトのクローズを開始します。 Disposeによって呼び出されます。通常、CloseはProcessオブジェクトのリソースを管理するために使用されます。
キル はプロセスを終了します。これは、ユーザーインターフェイスのないプロセスを終了する唯一の方法です。
CloseMainWindow は、プロセスのメインウィンドウに閉じるメッセージを送信します。これは、ユーザーインターフェイスを持つプロセスを停止するための優雅な方法です。
Close()and Kill()を呼び出したときに視覚的に何が起こるかを説明しましょう。以下はメモ帳を開きますが、myProcess.Close()の実行時に最後にメモ帳を終了しません。
Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Close();
以下はメモ帳を開きます。 10秒後、myProcess.Kill()が実行されると、メモ帳は最後に閉じます。
Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Kill();
Process.KillはTerminateProcessを呼び出します。
Process.Closeは、あなたが思っていることをしません!クラスのインスタンスによって使用されているリソースを単に解放します。これをお読みください: http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.close.aspx