.NET'te ArcObjects'i bellekten serbest bırakmak için kurallar nelerdir?


Yanıtlar:


18

En önemlisi, onlarla işiniz bittiğinde daima imleçleri açıkça bırakın . Ayrıca veritabanı erişimi ima bazı numaralandırma nesneleri, örneğin IRelationshipClass.GetRelationshipsForObject almak IEnumRelationship serbest .

Ayrıca, kısa ömürlü (özellikle sıkı döngülerde) çok sayıda COM örneği oluşturduğunuzda, bunları açıkça serbest bırakmak da iyi bir fikirdir.

Ayrı ayrı özellik (satır) referanslarının ne zaman serbest bırakılmasının önerilebileceği senaryoları da vardır. Örneğin, yeni bir coğrafi veritabanı sürümü oluşturursanız, verileri düzenleyin, mutabık kılın ve yayınlayın, daha sonra silmeye çalıştığınız sürüme (çalışma alanı) başvuruda bulunan yayınlanmamış satırlar olabileceğinden sürümü silme girişimleri başarısız olabilir. Bununla birlikte, çoğunlukla, bu tür senaryolar nadirdir ve bunları günlük ArcObjects geliştirmenizde hesaba katmanıza gerek yoktur. Kodu yalnızca yabancı temizleme ile karmaşık hale getirir ve daha az bakım yapılabilir hale getirir.

.NET sarmalayıcılarını ne zaman serbest bırakmayacağınızı söylemek de önemlidir - başka herhangi bir yönetilen kod tarafından kullanımda olabilecek RCO ArcObjects'i asla açıkça bırakmayın. Bunun bir örneği - ArcMap'deyken IMap'i serbest bırakmayın. Genel olarak, oluşturmadığınız ArcObjects'i serbest bırakmaya çalışmayın.



2

Her zaman yok et:

  • ICursors
  • IEnums

Başka bir yerde kullanılan bir şeyi yok etmemeye dikkat edin.

Bugün Kirk'ün katıldığı ESRI web sitesinde ilginç bir tartışma okudum. ReleaseComObject yöntemi ve FinalReleaseComObject (veya benzeri bir şey) kullanımı gibi başka çok ilginç görüşler vardı. Üzgünüm, şu an üzerimdeki bağlantı yok.

Bazıları IRow'ları serbest bırakmayı önerdi, ancak birçoğu GC'nin doğrudan onları kullanmasına izin vermenin daha kolay olduğunu kabul etti.

Hiçbir IGeometriyi asla serbest bırakmam. Bunu deneyen var mı?


1

ESRI.ArcGIS.ADF.ComReleaser kullanacağım. Tam olarak hangi yay nesnelerinin deterministik bir serbest bırakma modeli kullandığından emin değilim ama en önemli olanı çoğunlukla IServerContext nesnesine ekliyorum.

using (ComReleaser comReleaser = new ComReleaser())
{

}

2011 esri Geliştirici zirvesinde elde edebildiğim bazı bilgiler.

Hatırladığım büyük liste singleton nesneleri içindi (yardımda iki konu var).

Bu, ArcObjects'in .NET'te "COM referanslarını serbest bırakma" konusundaki en iyi uygulamalarından bağlantıdır: http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

Ve Geodatabase Blogunda, nesnelerin bir listesini içeren dört metrelik bir tartışma için bir yayın: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with -comreleaser_3f00_.aspx

(son olarak, URL'nin çalışmadığı durumlarda yardımcı olacak bir bağlantı içeren bir blog yazısı) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage -the-ömrü-of-the imleçler-in-.net.aspx


IServerContext ile çalışırken, ComReleaser'ın yaptığı gibi .NET RCW'sini yayınlamaktan daha önemlidir, bunun üzerine ReleaseContext'i çağırmaktır. En iyi yol, içeriği IDisposable'ı uygulayan bir .NET sınıfına sarmaktır (ve sonlandırıcının uygulanması da dahil olmak üzere standart imha modelini takip etmektir)
Petr Krebs

@Petr yes releaseContext çok büyük ve göz ardı etmediğim bir şey ama bunu herkes için yazılı hale getirdiğiniz için teşekkürler.
Steve

2
ComReleaser'ın 32bit derlemenin bir parçası olduğuna inanıyorum, yani ComReleaser'ı 64bit işleminde (örneğin ArcGIS Server) çalıştıramayacaksınız. Bir KİT yazıyordum ve bunun üzerine yandım.
bcollins

yayınlamak için başka seçenekler var mı?
VBAHole

@VBAHole fark ettiğimden değil. 10.5.1'de bile.
Steve

0

IWorkspace nesnelerini unutmayın. ESRI dev Zirvesi'nde birkaç yıl önce soruyu sordum ve ESRI'nin cevabı ICursor ve IWorkspace nesneleriydi.


Çalışma alanlarını serbest bırakmanın bir anlamı yoktur, çünkü çalışma alanı fabrika tekilleri tarafından önbelleğe alınırlar.
Preston

0

SOI'da İmleç gibi Sunucu Nesneleriyle çalışırken kurallar farklı mıdır? ComReleaser kullanmaya çalışıyorum ama her zaman benim SOI kod yöntemine yakın bir yere alır başarısız olur


Bir soruyu mevcut bir sorunun cevabı olarak göndermeyin. Mevcut soruya bir bağlantı ile yeni bir soru olarak gönderin.
Bjorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.