2013-08-27 6 views
8

私は最近の効果にはいくつかの生産コードを見たことがありますか?直観的に、プロセスが終了した場合、内部でコードを実行することはできません。Process.HasExitedを現在のプロセスに適用することはできますか?これはどんな意味を成してい</p> <pre><code>if (Process.GetCurrentProcess().HasExited) { // do something } </code></pre> <p>:

もしそうでなければ、現在のプロセスが終了しているかどうかを知る良い方法はありますか?

関連性がある場合は、プロセスが強制終了されたときに廃棄されないオブジェクトなどのアサーションをポップすることを避けることができます。

+0

それは私には分かりやすいですが、あなたの問題は何ですか? –

+2

私が言ったように、「直感的に、プロセスが終了してもコードは実行できません」このコードは実行されず、無意味です。 – Asik

+0

どのようなコンテキストでコードが実行されますか?私はここでマルチスレッドを意味します。 –

答えて

3

ソースコードIsExitedを確認すると、何も起こっていないことが判明します。 IsExitedは、プロセスが終了したかどうか、および終了コードが何であるかをOSに問い合わせます。それでおしまい。

トピックの出力リダイレクトは適用されません。

あなたが見つけたコードは、常にfalseと評価されます。それを取り除き、誰がそれを書いたのかを調べて、彼が何を意味しているかを尋ねるおそらく誤解。

0

実際にはこのようなシナリオを構築することができるように見える:

http://msdn.microsoft.com/en-US/library/system.diagnostics.process.hasexited.aspxでノートを参照してください。

標準出力は、非同期のイベントハンドラにリダイレクトされた場合には、それが出力処理をすることが可能ですこのプロパティがtrueを返すときに完了していません。非同期イベント処理が確実に完了するようにするには、HasExitedをチェックする前にパラメータを取らないWaitForExit()オーバーロードを呼び出します。 Thread.IsBackgroundから

+0

これは出力処理です。プロセスがまだ実行されていないときにコードを実行することはできません。 – Ryan

+5

これはあなたのものではなく*別の*プロセスを指しています。 –

+0

良い点。あなたが自分のアウトプットをキャッチすればどうなるのだろうかなんて不思議ですね。しかし、私はそれが行き詰まっていると思わなければなりません... – eFloh

1

:一度プロセスに属するすべてのフォアグラウンドスレッドが終了した

は、共通言語ランタイムは、処理を終了します。残りのバックグラウンドスレッドは停止され、完了しません。

私にとって、これは、プロセスが終了するとスレッドがコードを実行しないことを意味します。 Process.HasExitedからの声明については

標準出力は、非同期のイベントハンドラにリダイレクトされたとき、このプロパティがtrueを返したときに、出力処理が完了していない可能性があります。非同期イベント処理が確実に完了するようにするには、HasExitedをチェックする前にパラメータを取らないWaitForExit()オーバーロードを呼び出します。

非同期イベントハンドラは現在のプロセスのスレッドであり、プロセス自体を終了する必要がある場合に終了するため、これは当てはまりません。それらは、他のプロセスに接続されている場合にのみ実行できます。

関連する問題