.NETのメモリからArcObjectsを解放するためのルールは何ですか?


回答:


18

最も注目すべきは、カーソルを使い終わったら、常に明示的にカーソルを解放することです。IRelationshipClass.GetRelationshipsForObjectから取得するIEnumRelationshipなど、データベースアクセスを暗示するいくつかの列挙オブジェクトもリリースします。

また、短命(特にタイトループ)の多くのCOMインスタンスを作成する場合は、それらを明示的にリリースすることもお勧めします。

個々の機能(行)参照をリリースすることが推奨されるシナリオもあります。たとえば、新しいジオデータベースバージョンを作成し、データの編集、調整および投稿を行った場合、未リリースの行が存在する可能性があるため、バージョンを削除しようとすると失敗する可能性があります。ただし、ほとんどの場合、このようなシナリオはまれであり、日常のArcObjects開発でそれらを考慮する必要はありません。余分なクリーンアップでコードが乱雑になるだけで、保守性が低下します。

-ないときは、リリースの.NETラッパーに言うことも重要である決して明示的に他のマネージコードで使用されているかもしれないのArcObjectsのRCWを解放しません。この一例-ArcMapではIMapをリリースしないでください。一般に、作成しなかったArcObjectsをリリースしようとしないでください。


6

ほとんどの場合、.NETガベージコレクションはうまく機能します。ArcObjectsには、デストラクターで重要な作業を行うケースがいくつかあり、.NETラッパーの非決定的な性質が問題を引き起こす可能性があります。このヘルプトピックでは、懸念される主なケースとリリースの管理方法について説明します。



2

常に破壊する:

  • ICursors
  • IEnums

他の場所で使用されているものを破壊しないように注意してください。

今日、カークが参加したESRIのWebサイトで興味深い議論を読みました。ReleaseComObjectメソッドやFinalReleaseComObject(など)の使用など、他の非常に興味深い意見がありました。申し訳ありませんが、今はリンクがありません。

IRowsをリリースすることを提案する人もいましたが、多くの人が、GCに直接それらを処理させる方が簡単だということに同意しました。

IGeometryをリリースすることはありません。誰もがそれを試しましたか?


1

ESRI.ArcGIS.ADF.ComReleaserを使用します。とはいえ、どのアークオブジェクトが確定的なリリースパターンを使用しているかは正確にはわかりませんが、それが最も重要であるため、主にIServerContextオブジェクトにアタッチします。

using (ComReleaser comReleaser = new ComReleaser())
{

}

これは、2011年のesri開発者サミットで入手できた情報です。

私が覚えていた大きなリストは、シングルトンオブジェクトに関するものでした(ヘルプでは2つのトピックがあります)。

これは、.NETでArcObjectsを使用するためのベストプラクティスの「COM参照のリリース」トピックからのリンクです。http//help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

そして、ここではオブジェクトのリストが含まれていない4メートルの議論にジオブログ上のポストがある: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s-up-with ‑comreleaser_3f00_.aspx

(最後に、URLが機能しなかった場合に役立つリンクを含むブログ投稿) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage ‑the‑lifetime‑of‑cursors‑in‑.net.aspx


IServerContextを使用する場合、(ComReleaserのように.NET RCWをリリースするよりも)より重要なのは、ReleaseContextを呼び出すことです。最善の方法は、IDisposableを実装する.NETクラスでコンテキストをラップすることです(ファイナライザーの実装を含む標準の破棄パターンに従います)
Petr Krebs

@Petr yes releaseContextは巨大であり、私が見逃していないものですが、他のすべての人のためにそれを書いてくれてありがとう。
スティーブ

2
ComReleaserは32ビットアセンブリの一部であり、64ビットプロセス(ArcGIS Serverなど)でComReleaserを実行できないことを信じています。私はSOEを書いていて、これに火傷を負いました。
bcollins

サーバーをリリースする他のオプションはありますか?
VBAHole

@VBAHoleは私が気付いたことではありません。10.5.1アークオブジェクトでも。
スティーブ

0

IWorkspaceオブジェクトを忘れないでください。数年前のESRI Dev Summitで質問をしたところ、ESRIからの回答はICursorとIWorkspaceオブジェクトでした。


ワークスペースは、ワークスペースファクトリシングルトンによってキャッシュされるため、リリースする意味はありません。
プレストン

0

SOIのカーソルのようなサーバーオブジェクトを使用する場合、ルールは異なりますか?ComReleaserを使用しようとしていますが、SOIコードのメソッドの近くに到達するたびに失敗します


既存の質問への回答として質問を投稿しないでください。既存の質問へのリンクとともに、新しい質問として投稿してください。
ビヨン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.