2009-08-06 44 views
11

簡単な質問:デフォルトブラウザを使用してURLを開きたいので、ちょうどProcess.Start(url)を実行します。しかし、私はこれがIDisposableオブジェクトを返すことに気づいた。処理を取り消す必要がありますか?開始(URL)?

だから私はそれを処分する必要があるのだろうか?それとも、私のアプリケーションがこのプロセスに何らかの形で責任を負うのであれば?意図した機能は単純に「火と忘れ」です。私は自分のアプリケーションを新しいプロセスの親として持つことは望まないし、それと対話する必要もありません。

私は、URL上で単にProcess.Startを呼び出すだけで問題はないと言われるような、同様の、しかし無関係な質問を見たことがありますが、メモリリークやリソースの枯渇の問題をデバッグするのは難しい私の私のプログラムは、長いデッドブラウザプロセスへの参照を保持しています。

答えて

9

using句にラップして、GCが処分する必要がある場合にGCがそれに関係なく処理するようにすることはできませんか?これは、一種の "火と忘れ"を許しますが、メモリ/リソースを悪い状態にしないでください。

おそらく行き過ぎが、IDisposableインターフェイスについてCodeProjectの上で本当に良い記事があります:http://www.codeproject.com/KB/dotnet/idisposable.aspx

+0

問題は、この状況でのオブジェクトの寿命を完全には理解していないことです。私が(Process.Start(url))を使用している場合。その時点で待ちますか?あるいはプロセスを早期に処分するか?現時点では、それは行動に違いはありませんので、オープンな状態に保たれているリソースはないと確信していますが、確かなことは分かりませんし、その測定方法もわかりません。 –

+0

"using"句は暗黙のうちにtry/finallyをビルドしてdisposeを実装し、IDisposableオブジェクトを返すという事実をコンパイラに指示するので、あなたはそれを行うのが安全だと思います。割り当てを解除しないと、リソースを結びつける可能性があります。いくつかのURLを破棄せずに開き、リソースが制御から外れているかどうか、そして節を使用して別のテストをラップすることで、ループを構築することができます。注意しなければならないのは、その後に閉じるための窓がたくさんあるからです。 :) – Fooberichu

5

プロセスを開始するには、返されるプロセスのインスタンスに格納されたネイティブプロセスハンドルを返すネイティブ呼び出しです。 Processには、ハンドルを使用するメソッドがあります。そのため、プロセスが終了するのを待つか、アイドル状態になるようなことができます。

プロセスを廃棄すると、そのハンドルが解放されます。私はJonと同意し、それをusing節で囲みます。

10

いいえ、そうではありません。

void Main() 
{ 
    Process result = Process.Start("http://www.google.com"); 

    if (result == null) 
    { 
     Console.WriteLine("It returned null"); 
    } 
} 

プリントMSDN(.NET Frameworkの4)上のProcess.Start Method (String)から

It returned null

起動するための実行可能ファイルのアドレスはURLであれば、プロセス ではありません開始され、nullが返されます。

(一般的には、しかし、using文がWCF clientsを除く。IDisposableをオブジェクトを操作するための正しい方法である。)

Fooberichuの答えは上のスポットですが、私はそれもあることを指摘する価値があると思う@
+0

ブラウザプロセス** IS **が起動しても、それでもnullが返されます! – AgentFire

+0

@AgentFireブラウザの読み込みの有無にかかわらず、URLには常にnullが返されます。それがポイントです - あなたはこの特定のケース(URL)で処分する必要はありません。 – TrueWill

2

通常、明示的に処理する必要があるのはほんのわずかです。

オブジェクトは、常に効果的一部時点で配置されている:

  • GCコレクションをする任意の時間を、それは(最終的に)もはや参照されるオブジェクトを処分します。したがって、手動で処理しないと、オブジェクトはスコープから外れて数秒以内に処分されることがあります。
  • アプリケーションが終了すると、保持しているすべてのリソースが解放されます。 (オブジェクトはC#/ .netによって処理されないかもしれませんが、OSはあなたのプロセスを把握して戻ってくると主張します。資源の有効期間は、アプリケーションを超えて拡張する場合は、OSがそれをクリーンアップするために、通常は責任がある)

手動)を配置(または「を使用して」採用のポイントは、資源ことを確実にするためではないので、あるがリリースされますが、に可能な限り早くリリースしてください。

最近、ほとんどの種類のリソース(メモリ、ファイルハンドル、システムブラシなど)が使い果たされることはほとんどありません。ただし、必要がないときにリソースを保持すると、プログラムの効率が低下したり、必要以上にメモリを使用したり、一時的に他のアプリケーションの有用な処理をブロックして遅延を引き起こす可能性があります。 Disposingは良いエチケット、整頓、不必要な非効率性を排除することです。

リソースがである場合は、をリリースする必要があります(たとえば、ファイルを閉じることができない場合は、プログラムや他のプログラムのどこからでも名前を変更/移動/削除できません。あなたのグラフィックスカードにテクスチャを割り当てたまま放置しておくと、VRAMが使い果たされ、コンピュータのディスプレイに表示されません)。しかし、一般的に、これらの状況に遭遇することはめったになく、ベストプラクティス(明示的にオブジェクトを 'もう必要ない)、通常、これらの状況がいつ起こっているかを知る必要はありません。なぜなら、それらの状況がすでに正しく処理されているからです。

+2

多くの場合、IDisposableクラスにはファイナライザがありません。 **明示的に**配備されていない状態でGCされた場合、それらに関連付けられたアンマネージリソースはすべてリークされます。フレームワーククラスは、ほとんどの場合私たちを保護するうえで優れていますが、IDisposableオブジェクトを常に処分するのがベストプラクティスです。このクライアントとWCFクライアントは、2つの奇妙なエッジケースになります。 – TrueWill

関連する問題