SORU
26 Mayıs 2009, Salı


İmha etmeliyim() veri Kümesi ve DataTable?

Ve her iki IDisposable uygulayan, geleneksel en iyi uygulamalar, onların İmha aramalıyım yani veri kümesi DataTable() yöntemleri.

Ancak, şimdiye kadar okuduğum kadarıyla, veri Kümesi ve DataTable aslında herhangi bir yönetilmeyen kaynakları yok, bu yüzden İmha() aslında fazla bir şey yapmıyor.

Ayrıca, veri Kümesi DataTable bir koleksiyona sahiptir çünkü using(DataSet myDataSet...) kullanamam.

Bu yüzden güvende olmak için, myDataSet arasında dolaşmak gerek.Tablolar, DataTable her atma, veri Kümesi elden çıkar.

Değeri aramak için güçlük İmha() Veri setleri ve benim DataTable üzerinde?

Ek:

Bu veri Kümesi bertaraf edilmesi gerektiğini düşünen: Genel olarak, kurtulmak için desen Atma garanti etmek istediğin için using try..finally kullanmaktır() çağrılır.

Ancak, bu çirkin, çok çabuk bir koleksiyon için alır. Örneğin, bir telefonu varsa Elden ne yapıyorsun() atılan bir özel durum? Seni yutmak ("") kötü bir sonraki eleman atılması devam öyle mi?

Ben de myDataSet çağrı önerirsin.() Atılması, ve myDataSet içinde DataTable atılması unut.Tablolar?

CEVAP
21 EKİM 2009, ÇARŞAMBA


Güncelleme (1 Aralık 2009):

Bu cevabı değiştirmek istiyorum ve özgün cevap hatalı olduğunu kabul ediyorlar.

Orijinal analizyoksonlandırma gerektiren nesneler için geçerlidir ve uygulamaları, derinlemesine doğru bir anlayış olmadan yüzeyinde kabul edilmesi gerektiğini hala önemli bir nokta var.

Ancak, bu Veri, DataViews, DataTable dönüyorkendi kurucular içinde sonuçlandırılması bastırmak– bu aramayı neden Dipose() onlara açıkça hiçbir şey yapmaz.

Muhtemelen, bu olmasına rağmen yönetilmeyen kaynakları; böylece yok olurMarshalByValueComponentyapar yönetilmeyen kaynakları için ödenek, bu özel uygulamaları gerek yok ve bu yüzden sonuçlandırılması vazgeçmek olabilir.

(Bu .NET yazarları bakım finalizable türleri için genel olarak bu uygulama önemini konuşuyor normalde işgal bu tür sonuçlandırılması bastırmak için alacaktı.)

Bu ayrıntıları hala altında belgelenen rağmen, kuruluşundan bu yana .NET Çerçevesi (nerdeyse 8 yıl önce) oldukça şaşırtıcı (o sensin aslında sol için kendi cihazları için elemek rağmen çelişkili, belirsiz malzeme koymak için parçaları bir araya sinir bozucu bazen ama bulunur bir daha tam bir anlayış çerçevesinde güveniriz günlük).

Okuduktan çok sonra, burada benim anladığım:

Eğer bir nesne sonlandırma gerektirirolabilirişgal bellek artık daha fazla ihtiyacı var – işte nedeni: a) Herhangi bir türü tanımlar bir yıkıcı (ya da kalıtım yoluyla gelen bir türü tanımlar bir yıkıcı olarak ele alınır finalizable; b) ayırma (önce yapıcı çalışır), bir gösterici yerleştirilir Sonlandırma sırası; c) Bir finalizable nesne normalde gerektirir2 koleksiyonları(standart 1) yerine iadesi için; d) sonlandırma Bastırmak sonlandırma sırası (tarafından bildirilen !bir nesne kaldırmaz SOS içinde FinalizeQueue) Bu komut yanıltıcı; Bilmek ne nesneler üzerinde sonuçlanması sıra (ve kendisi) değil yararlı; Bilmek ne nesneler üzerinde sonlandırma sırası ve hala ihtiyaç sonuçlandırılması yararlı olacaktır (orada bir komut için bu?)

DataTable, DataSet, DataView sınıfları MarshalByValueComponent, (potansiyel olarak) yönetilmeyen kaynakları kullanabilen finalizable bir nesne de köklü

  • DataTable, DataSet, DataView yönetilmeyen kaynakları tanıtmak yok, çünkü onlar kendi kurucular içinde sonuçlandırılması bastırmak
  • Bu alışılmadık bir şekilde olsa da, kullanımdan sonra İmha arama konusunda endişelenmenize gerek arayan açığa çıkar
  • Bu, DataTable ve potansiyel olarak farklı Veri setleri arasında paylaşılan olabilir aslında, Veri setleri çocuk DataTable atmanız umrumda değil neden muhtemeldir
  • Bu nesneleri altında görüntülenir, bu da demek oluyor !SOS içinde FinalizeQueue
  • Ancak, bu nesneleri hala olmayan finalizable meslektaşları gibi tek bir koleksiyon sonra ıslah olmalıdır

4 (yeni kaynaklar):

Orijinal Cevabı:

Bu yanıltıcı ve genel olarak çok kötü cevaplar var - buraya düşen herkes gürültü yok sayıp başvurular aşağıda dikkatlice okumalısınız.

Hiç şüphesiz, Atınolmalıdırherhangi bir Finalizable nesneleri denir.

DataTableFinalizable.

Elden Arıyorumönemli ölçüdebellek geri ödemelerine hızlandırır.

MarshalByValueComponentçağırırGC.SuppressFinalize(bu)Atma() - bunun anlamı, bellek geri alınmadan önce onlarca değilse Gen0 koleksiyonları yüzlerce için beklemek zorunda atlama:

Sonuçlanması da bu temel anlayış ile biz zaten çok önemli bir olayının şeyler:

Öncelikle sonuçlandırılması gereken nesneler uzun olmayan nesneler daha canlı. Aslında, çok daha uzun yaşayabilirler. Örneğin, bir nesne sanırım gen2 içinde tamamlanması gerekiyor. Sonuçlandırılması ama planlanır nesne hala çok gen2, yeniden toplanan bir sonraki kadar gen2 toplama olur. Olabilir çok uzun bir süre gerçekten, ve, aslında, iyi bir şeyler olacak gibi gitseydi , gen2 koleksiyonları çünkü uzun zaman istediğimiz masraflı ve böylece çok seyrek olur. Eski nesneleri sonuçlandırılması ihtiyacı olabilir yoksa onlarca beklemek zorunda gen0 koleksiyonları yüzlerce önce onların uzay iadesi.

İkinci olarak, sonuçlandırılması gereken nesneler teminat hasara neden olabilir. Yana iç nesne işaretçileri kalmalıdır değil, sadece nesneleri geçerli doğrudan ihtiyacı sonuçlandırılması ayrılamıyorum bellek ama her şey nesne doğrudan ve dolaylı olarak,ifade eder ayrıca bellekte kalır. Bir büyük varsa nesneleri ağaç demirlemiş tek gereken nesne sonuçlandırılması, sonra da tüm ağacı uzun olası için barınır biz sadece tartıştık. Bu bu nedenle, kullanmak için sonlandırıcı tutumlu ve nesneleri yerleştirmek bu kadar az iç nesne var mümkün olduğunca işaretçiler. Ağaç örnek sadece, kolayca verdi bu taşıyarak sorunu önlemek sonlandırılması gereken bir kaynak ayrı bir nesne ve bir tutma kök nesne için referans ağaç. Mütevazı değişikliği ile tek bir nesne (umarım bir güzel küçük nesne) takılıp kalır ve sonuçlandırılması maliyet en aza iner.

Son olarak, nesneleri sonuçlandırılması gerek sonlandırıcı iş parçacığı için iş yaratmak. Eğer sonlandırma işlemi bir ise karmaşık bir, tek ve biricik sonlandırıcı iş parçacığı bir harcama olacak bu adımları gerçekleştirmek için zaman,çok bir bekleme listesi neden olan ve iş bu nedenle daha fazla nesneleri dinlenmeye neden sonuçlanması için bekliyor. Bu nedenle, bu hayati önem taşımaktadır sonlandırıcı az iş yapmak gibi mümkün. Ayrıca olsa da unutma tüm işaretçiler geçerli kalır nesne sonuçlandırılması sırasında olabilir bu işaretçiler neden bu davaya zaten nesneleri kesinleşmiş ve bu nedenle daha az olabilir daha yararlı. Genellikle güvenli olur nesne işaretçileri takip önlemek sonuçlandırılması kod olsa bile işaretçiler geçerli. Güvenli, kısa bir kod yolu sonuçlanması en iyisi.

Gen2 olmayan başvurulan DataTable MB 100'ler gören biri olarak söylüyorum: bu son derece önemlidir ve tamamen bu konu üzerine cevaplar ile cevapsız.

Referanslar:

1 - http://msdn.microsoft.com/en-us/library/ms973837.aspx

2 - http://vineetgupta.spaces.live.com/blog/cns!8DE4BDC896BEE1AD!1104.entry http://www.dotnetfunda.com/articles/article524-net-best-practice-no-2-improve-garbage-collector-performance-using-finalizedispose-pattern.aspx

3 - http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Shon Gonzales

    Shon Gonzale

    5 EKİM 2014
  • tychoadragmire

    tychoadragmi

    20 Mart 2006