ArcObjects .NET - Cara menutup / melepaskan FeatureClass, Workspace, Factory


8

Saya memiliki proses yang berjalan lama. Saya ingin mencegah kebocoran sumber daya atau koneksi basis data yang tidak benar.

Pada interval selama proses saya ingin melakukan ini:

  1. dapatkan pabrik ruang kerja ArcSDE (Oracle)
  2. buka ruang kerja dari pabrik (saat itu saya mendapatkan koneksi database terbuka)
  3. dapatkan kelas fitur atau tabel yang ada di ruang kerja,
  4. query kelas fitur atau tabel, lewati kursor yang menjalankan bisnis saya
  5. kemudian lepaskan / tutup semuanya sehingga :

    • Koneksi basis data dan kunci tabel dari perspektif ArcSDE / Oracle (seperti diungkapkan oleh sesuatu seperti "sdemon -o info -I pengguna" atau kueri dari tabel sde.table_locks) ditutup / dirilis.
    • proses ini tangguh untuk ArcSDE / Oracle restart (yaitu, saya tidak meninggalkan sesuatu yang menggantung yang tidak akan berfungsi setelah restart setiap malam)
    • RCW, referensi COM, dan memori dilepaskan.

Pada dasarnya, karena sifat proses yang berjalan lama, saya ingin benar-benar yakin saya tidak punya kebocoran sumber daya atau koneksi yang tidak benar, dan proses saya dapat bertahan hidup dengan ArcSDE / Oracle restart .

Saya telah melihat diskusi seperti:

Dan ini , dari mana saya kutip

Setiap pabrik ruang kerja memiliki kumpulan ruang kerja aktif yang terhubung saat ini yang direferensikan oleh aplikasi. Ketika salah satu metode Open * yang sebelumnya terdaftar dipanggil, pabrik ruang kerja memverifikasi jika ruang kerja sebelumnya telah dibuka dengan set properti yang cocok. Jika demikian, referensi ke instance yang ada dikembalikan.

Semua yang menyarankan kepada saya bahwa saya harus melepaskan (misalnya kelas ComReleaser atau setara Marshal.ReleaseComObject ()), mungkin dalam urutan ini:

  • kursor
  • Featureeclass / tabel
  • ruang kerja
  • pabrik ruang kerja

Lalu ada diskusi seperti ini di mana orang melakukan semua itu, dan mungkin bahkan menaburkan di System.GC.Collect () dan koneksi database mereka masih hidup.

Oh guru, apa obat bius lurus terakhir tentang ini?


1
Sudahkah Anda mencoba sesuatu sendiri, atau Anda hanya meminta nasihat? Taruhan teraman tampaknya menelurkan utas baru atau proses untuk melakukan pekerjaan berkala Anda. Kalau tidak, menurut saya itu akan berhasil jika Anda berhasil melacak semua objek dan melepaskannya sesuai dengan rencana Anda. Jika Anda memiliki kontrol peta, peta itu mungkin juga berisi referensi melalui lapisan.
Stefan

Saya sedang dalam proses dan meminta saran. Berikut ini adalah pertanyaan lanjutan untuk komentar Anda - Jika saya melakukan tugas berkala pada utas pekerja, haruskah pekerja melepaskan pabrik ruang kerja, atau menjadi singleton, akankah hal itu menyebabkan probs untuk kemungkinan utas lainnya secara simultan? Dugaan saya adalah saya harus meninggalkan pabrik sendirian?
MC5

Ada banyak tulisan tentang model arc threading. Baca edndoc.esri.com/arcobjects/9.2/net/… (9.2 tapi saya pikir masih valid). Dikatakan bahwa singelton adalah singelton per utas, bukan per proses. Perhatikan juga bahwa utas harus STA dan Anda tidak bisa melewatkan referensi objek busur di antara utas. Jadi, jika Anda menghentikan pekerja itu harus membersihkan pabrik. Lihat juga tautan Anda sendiri ke forum ESRI di mana threading direkomendasikan oleh ESRI sebagai solusi untuk membebaskan koneksi.
Stefan

Jawaban:


4

Anda telah membahas banyak aspek dalam pos Anda. Namun untuk memperluas pertanyaan Anda, selalu ikuti pola ini:

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

obj = null;

Kemudian panggilan System.GC.Collect()untuk memaksa pengumpul sampah untuk menghapus referensi ke DBMS.

Urutan rilis harus Cursor, Fitur (IFeature), FeatureClasses, Workspaces dan ArcObjects lainnya instantiated.

Aplikasi ArcGIS Desktop dan ArcEngine adalah STA (aplikasi berulir tunggal). Tidak aman atau disarankan untuk menggunakan ArcObjects di seluruh thread (Pekerja); Seseorang dapat menggunakan serialisasi dan deserialisasi objek untuk mencapai ini. Untuk perincian lebih lanjut, lihat di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.