私は使用しているサードパーティのコンポーネントを持っていますが、リソースが解放されていないという問題があります。このコンポーネントは、ウィンドウにUDPソケット( "\ Device \ Udp"と "\ Device \ Afd")のハンドルを作成させます。プログラムでサードパーティオブジェクトを実行および参照解除できるようにする場合、私は過去に作業したすべての.NETオブジェクトと同様に、オブジェクトがガベージコレクションされると想定しました。しかし、Process Explorerは、 "\ Device \ Udp"ハンドルが実際のプロセスが終了するまで無期限に保持されていることを示しています(アプリケーションプールはリサイクルされています)。ガベージコレクションされていないオブジェクト
さらに、オブジェクトのDispose()メソッドを呼び出すと、ハンドルが解放されます。これは、私が使用している修正ですが、なぜ必要なのか不思議です。コンポーネントの作成者が何かを行ったか、ガベージコレクタがオブジェクトの破棄を呼び出さないようにする属性?
このコードは、Formsアプリケーションで使用されていたため、whileループが完了しても終了しない。
(無限に作成された100のハンドル)は動作しませんコード:作業を行い
for (int i = 0; i < n; i++)
{
Snmpmgr mgr = new Snmpmgr();
mgr.Timeout = 10;
mgr.ObjCount = 1;
mgr.ObjId[1] = ".1.3.6.1.2.1.1.1.0";
try
{
mgr.SendGetRequest(); // Handle shows up in ProcExplorer after this call
}
catch (Exception ex)
{
throw new TimeoutException("Error contacting CMTS.");
}
} // end of for... obj referenced by mgr never garbage collected
はコード(ハンドルが作成され、リリース):あなたの助けを事前に
for (int i = 0; i < n; i++)
{
Snmpmgr mgr = new Snmpmgr();
mgr.Timeout = 10;
mgr.ObjCount = 1;
mgr.ObjId[1] = ".1.3.6.1.2.1.1.1.0";
try
{
mgr.SendGetRequest(); // Handle shows up in ProcExplorer after this
}
catch (Exception ex)
{
throw new TimeoutException("Error contacting CMTS.");
}
mgr.Dispose(); // UDP Socket Handle freed... not sure that's how to spell free + ed :)
}
感謝。
Chris
実際に、 'Snmpmgr'クラスの中でソケットハンドルをどのように作成しているかについてのコードフラグメントを表示できますか? – jerryjvl
Snmpmgrは、nsoftwareが作成した第三者コンポーネントです(http://www.nsoftware.com/portal/dotnet/)。私たちが支払う価格表のために、私は実際にサードパーティのソフトウェアのトラブルシューティングのような気がしません。私は主に、彼らのcomponentsenetの動作に何らかの問題があったかどうか不思議でしたので、私は事件を開くことができました。 – regex
以下に述べるように、正しい答えは、オブジェクトの処理が完了したときにオブジェクトをDispose()することです。つまり、ベンダーが廃棄パターンを適切に実装していないように思えます(http://msdn.microsoft.com/en-us/library/fs2xkftw%28VS.80%29.aspxおよびhttp://stackoverflow.com参照)。/questions/898828/c-finalize-dispose-pattern)。要するに、管理対象外のリソースを処分する必要があるクラスがある場合、Dispose()がまだ確定的に呼び出されていない場合は、ガベージコレクション中に自分自身で処分する必要があります。 –