ArcObjects .NET-FeatureClass、Workspace、Factoryを閉じる/リリースする方法


8

長期にわたるプロセスがあります。リソースリークや不正なデータベース接続を防止したい。

プロセス中の間隔でこれを実行したい:

  1. ArcSDE(Oracle)ワークスペースファクトリを取得する
  2. 工場からワークスペースを開きます(この時点でデータベース接続が開かれます)
  3. ワークスペースに既存のフィーチャクラスまたはテーブルを取得し、
  4. フィーチャクラスまたはテーブルをクエリし、カーソルをループしてビジネスを行います
  5. 次に、次のようなものをすべて解放/閉じます

    • ArcSDE / Oracleの観点からのデータベース接続とテーブルロック(「sdemon -o info -I users」またはsde.table_locksテーブルのクエリなどによって明らかになる)は、クローズ/解放されます。
    • プロセスは、ArcSDE / Oracleの再起動に対して回復力があります(つまり、毎晩の再起動後に後で機能しない何かがハングしたままになることはありません)。
    • RCW、COM参照、およびメモリが解放されます。

基本的に、プロセスは長時間実行されるため、リソースリークや不正な接続が発生していないことを確認し、プロセスがArcSDE / Oracleの再起動に耐えられるようにします

私は次のような議論を見てきました:

そしてこの、からIの引用

各ワークスペースファクトリは、アプリケーションによって参照される、現在接続されているアクティブなワークスペースのプールを維持します。上記のOpen *メソッドのいずれかが呼び出されると、ワークスペースファクトリは、一致するプロパティセットでワークスペースが以前に開かれているかどうかを確認します。その場合、既存のインスタンスへの参照が返されます。

これらすべてから、おそらくこの順序で、リリースする必要があることがわかります(たとえば、ComReleaserクラスまたは同等のMarshal.ReleaseComObject()ループ)。

  • カーソル
  • フィーチャクラス/テーブル
  • ワークスペース
  • ワークスペース工場

次に、このような議論が行われ、人々はそれをすべて行います。おそらくSystem.GC.Collect()に振りかけても、データベース接続はまだ存続しています。

おお、教祖、これの最後のストレートドープは何ですか?


1
自分で何か試したことがありますか、それともアドバイスを求めているだけですか?最も安全な賭けは、定期的な作業を行うために新しいスレッドまたはプロセスを生成するようです。そうでなければ、私の意見では、すべてのオブジェクトを追跡し、計画に従ってそれらを解放することができればうまくいくでしょう。mapcontrolがある場合は、レイヤーを介した参照も含まれている可能性があります。
ステファン

私は進行中で、助言を求めています。ここにあなたのコメントへのフォローアップの質問があります-ワーカースレッドで定期的なタスクを実行する場合、ワーカーがワークスペースファクトリをリリースする必要がありますか、それがシングルトンである場合、他の可能な同時スレッドの問題が発生しますか?私は工場を放っておくべきでしょうか?
MC5 2014年

アークオブジェクトのスレッドモデルについては、多くのことが書かれています。edndoc.esri.com/arcobjects/9.2/net/…を読んでください(9.2ですが、まだ有効だと思います)。singeltonはプロセスごとではなくスレッドごとのsingeltonであると述べています。また、スレッドはSTAである必要があり、スレッド間でアークオブジェクト参照を渡すことはできません。したがって、ワーカースレッドを終了すると、ファクトリがクリーンアップされます。また、ESRIフォーラムへの独自のリンクを参照してください。ここでは、接続を解放するソリューションとして、ESRIによってスレッド化が推奨されています。
Stefan

回答:


4

投稿の多くの側面をすでにカバーしています。ただし、質問を拡張するには、常に次のパターンに従ってください。

if (obj!=null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(obj);

obj = null;

次に、を呼び出しSystem.GC.Collect()て、ガベージコレクターにDBMSへの参照を強制的に削除させます。

リリースの順序は、カーソル、フィーチャ(IFeature)、FeatureClasses、ワークスペース、およびインスタンス化されたその他のArcObjectである必要があります。

ArcGIS DesktopとArcEngineアプリケーションはSTA(シングルスレッドアプリケーション)です。スレッド全体(ワーカー)でArcObjectsを使用することは安全でもお勧めでもありません。オブジェクトのシリアライゼーションとデシリアライゼーションを使用して、これを実現できます。詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.