Apa aturan untuk melepaskan ArcObjects dari memori di .NET?

14

Apakah saya perlu melepaskan setiap objek? Apakah manajemen memori ditangani untuk saya?

patrick
sumber

Jawaban:

18

Terutama, selalu lepaskan kursor secara eksplisit ketika Anda selesai menggunakannya. Saya juga merilis beberapa objek enumerasi yang menyiratkan akses database, misalnya IEnumRelationship yang Anda dapatkan dari IRelationshipClass.GetRelationshipsForObject .

Juga, ketika Anda membuat banyak instance COM yang berumur pendek (terutama di loop ketat), itu juga ide yang baik untuk melepaskannya secara eksplisit.

Ada juga skenario kapan disarankan untuk merilis referensi fitur (baris) individual. Misalnya, jika Anda membuat versi geodatabase baru, mengedit data, merekonsiliasi & memposting, upaya untuk menghapus versi setelahnya mungkin gagal karena mungkin ada baris yang tidak dirilis, yang pada gilirannya tetap mengacu pada versi (ruang kerja) yang Anda coba hapus. Namun, sebagian besar skenario seperti itu jarang terjadi dan Anda tidak perlu memperhitungkannya dalam pengembangan ArcObjects Anda sehari-hari. Itu hanya akan membuat kode berantakan dengan pembersihan luar, membuatnya kurang terawat.

Penting juga untuk mengatakan kapan tidak merilis .NET wrappers - jangan pernah secara eksplisit melepaskan RCW dari ArcObjects yang mungkin digunakan oleh kode terkelola lainnya. Salah satu contohnya - jangan merilis IMap ketika di ArcMap. Secara umum, jangan mencoba untuk melepaskan ArcObjects yang tidak Anda buat.

Petr Krebs
sumber
6

Untuk sebagian besar pengumpulan sampah .NET bekerja dengan baik. Ada beberapa kasus di ArcObjects yang melakukan pekerjaan penting pada desctructors dan sifat non-deterministik dari pembungkus .NET dapat menyebabkan masalah. Topik bantuan ini mencakup kasus utama yang harus diperhatikan dan cara mengelola rilis.

Craig Williams
sumber
2
Tautan yang sama dalam 10: help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/…
MathiasWestin
2

Selalu hancurkan:

  • ICursors
  • IEnums

Berhati-hatilah untuk tidak menghancurkan sesuatu yang sedang digunakan di tempat lain.

Hari ini saya membaca diskusi menarik di situs web ESRI di mana Kirk berpartisipasi. Ada pendapat lain yang sangat menarik, seperti penggunaan metode ReleaseComObject dan FinalReleaseComObject (atau yang sejenisnya). Maaf saya tidak memiliki tautan pada saya sekarang.

Beberapa bahkan menyarankan untuk melepaskan IRows, tetapi banyak yang setuju bahwa lebih mudah untuk membiarkan GC menanganinya secara langsung.

Saya tidak pernah merilis IGeometry. Adakah yang mencobanya?

George Silva
sumber
1

Saya akan menggunakan ESRI.ArcGIS.ADF.ComReleaser. Yang sedang berkata saya tidak benar-benar yakin objek busur mana yang menggunakan pola rilis deterministik tapi saya kebanyakan melampirkannya ke objek IServerContext karena itu yang paling penting.

using (ComReleaser comReleaser = new ComReleaser())
{

}

inilah beberapa informasi yang dapat saya peroleh pada KTT Pengembang 2011 esri.

Daftar besar yang saya ingat adalah untuk objek tunggal (yang merupakan dua topik dalam bantuan).

Ini adalah tautan dari praktik terbaik untuk menggunakan ArcObjects di .NET "Melepaskan referensi COM" topik: http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

Dan di sini ada posting di Blog Geodatabase untuk diskusi empatm yang berisi daftar objek: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s-up -with Comcomeleaser_3f00_.aspx

(terakhir posting blog dengan tautan untuk membantu seandainya url tidak berfungsi) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using -the-comreleaser -to -manage ‑Kursus seumur hidup in in net .net.aspx

Steve
sumber
Ketika bekerja dengan IServerContext, yang lebih penting (daripada merilis .NET RCW seperti yang dilakukan ComReleaser) adalah dengan memanggil ReleaseContext di dalamnya. Cara terbaik adalah dengan membungkus konteks dalam kelas .NET menerapkan IDisposable (dan mengikuti pola buang standar termasuk menerapkan finalizer)
Petr Krebs
@Petr ya releaseContext sangat besar dan sesuatu yang belum saya abaikan tetapi terima kasih telah menuliskannya untuk semua orang.
Steve
2
Saya percaya bahwa ComReleaser adalah bagian dari perakitan 32bit yang berarti bahwa Anda tidak akan dapat menjalankan ComReleaser dalam proses 64bit (mis. ArcGIS Server). Saya sedang menulis BUMN dan terbakar pada ini.
bcollins
apakah ada opsi lain untuk pelepasan Server?
VBAHole
@ VBAHole tidak saya perhatikan. Bahkan pada 10.5.1 arcobjects.
Steve
0

Jangan lupa objek IWorkspace. Pada KTT ESRI dev beberapa tahun yang lalu, saya mengajukan pertanyaan, dan jawaban dari ESRI adalah objek ICursor dan IWorkspace.

BlinkyBill
sumber
Tidak ada gunanya untuk merilis ruang kerja karena mereka di-cache oleh lajang pabrik ruang kerja.
Preston
0

perbedaan aturan saat bekerja dengan Objek Server seperti Kursor dalam SOI? Saya mencoba menggunakan ComReleaser tetapi gagal setiap kali mendekati metode dalam kode SOI saya

VBAHole
sumber
Jangan memposting pertanyaan sebagai jawaban untuk pertanyaan yang ada. Posting itu sebagai pertanyaan baru, dengan tautan ke yang sudah ada.
Bjorn