1

Close()System.Diagnostics.Processクラスにメソッドが必要ですか?

編集:Processは、ほぼ瞬時に終了するコンソールアプリケーションを監視しています...

ビリー3

4

4 に答える 4

3

はい

ただし、これはClose単にアプリケーションに対してローカルなリソースを解放することと関係があることに注意してください。プロセスを終了しようとはしません。CloseMainWindow()これを行うには、 (GUIアプリケーションの場合)またはKill()(任意のアプリケーションの場合)のいずれかを呼び出す必要があります。

Processクラスはを実装します。IDisposable厳密に言えば、Disposeオブジェクトの処理が終了したら、呼び出す必要があります。Disposeただし、このような多くのクラスでは、メソッドの公開バージョンはですClose

このようなオブジェクトを処理する最も簡単な(そして最も信頼できる)方法は、usingブロックを使用することです。Disposeこれにより、ブロックの終わりに達するとすぐに変数が自動的に呼び出されます。また、オブジェクトの破棄を妨げる例外からユーザーを保護します。

例えば:

using(System.Diagnostics.Process process = new System.Diagnostics.Process())
{
    // set your properties and launch it
    // wait for it to exit if you want to, or just let it continue to run
}

これは、これを行うことと機能的に同等です。

System.Diagnostics.Process process = new System.Diagnostics.Process();

try
{
    // set your properties and launch it
    // wait for it to exit if you want to, or just let it continue to run
}
finally
{
    process.Close();
}

(意味的に同等ではなく、機能的に同等であると述べたことに注意してください。実際には、usingブロックはオブジェクトへの独自のハンドルをとして維持し、ではなくIDisposableを呼び出します。ただし、この質問には関係ありません。)DisposeClose

于 2010-06-28T16:32:19.910 に答える
2

いいえ、必ずしもそうではありません。

通常、Process インスタンスなどの IDisposable は常に Dispose() を呼び出す (または using ステートメントでラップする) ことをお勧めします。ただし、これが適切に記述されていれば、そうしなくても、最終的に GC はファイナライザーですべてのクリーンアップを実行します。

割り当てられたリソースに応じて、これは一定期間メモリ/リソースに重大な「ヒット」を与える場合としない場合があります。プロセスの場合、GC がオブジェクトを収集してファイナライズするまでプロセス ハンドル (比較的小さい) を保持することになりますが、これはおそらくプログラム全体に大きな影響を与えることはありません。

于 2010-06-28T16:22:14.973 に答える
0

致命的ではありません - ガベージ コレクターはProcess最終的に のファイナライザーを呼び出し、オブジェクトのリソースはそのようにクリーンアップされます。

ただし、リソースが不要になったらすぐに、直接呼び出すか、コードをブロックCloseにラップして解放することをお勧めします。usingこのようにして、ガベージ コレクターの負荷を軽減し、後でではなく少し前にメモリを解放します。

于 2010-06-28T16:21:59.923 に答える
0

Close(またはDispose)オペレーティングシステム全体のリソースを解放します(おそらく比較的少量が許可されます)。これらは、システム上の他のすべてのプロセスと共有するものであるため、良き市民であるためには、できるだけタイムリーにリリースする必要があります。

最終的には、ファイナライザーを実行しているガベージコレクターを介して、またはプロセスが終了したときに解放されます。

于 2010-06-28T16:28:56.373 に答える