2010-11-18 18 views
2

Eski "Pencere tanıtıcısı oluşturulurken hata" ile mücadele yapıyorum. Uygulamamın şu anda üzerinde çalıştığı her türlü denetimi barındıran bir merkez alanı var. Kullanıcı yeni bir kontrol yüklediğinde, eski olanı yok ederim. Ya da en azından denerim. Görev yöneticisini çalıştırdığımda, yeni bir kontrolün yüklenmesiyle GDI nesnelerinin sayısının azaltılmaması nedeniyle dehşet görüyorum. Yaptığım bir contorl'i öldürmeye çalıştığım şey bu. Sayaç, sonunda doğru gibi görünen büyük bir sayı gösterir, ancak Görev Yöneticisi'ndeki GDI nesneleri yaklaşık 10.000'e ulaşana kadar aynı kalır ve sonra her şey çökmeye başlar.Hata Oluşturma Pencere Kolu

private void RecursivelyKillYourself(Control C) { 
     if (C.Controls != null && C.Controls.Count > 0) { 
      List<Control> Controls = C.Controls.OfType<Control>().ToList(); 
      C.Controls.Clear(); 
      Controls.ForEach(c_inner => RecursivelyKillYourself(c_inner)); 
     } else { 
      C.Dispose(); 
      num++; 
     } 
    } 

DÜZENLEME

Sabit - lazım doğru araç ipuçlarını oluşturmak emin olun. Ayrıca, bir yorumcu işaret ettiği gibi, bu uzun aptalca Recursive yöntemi gereksizdir. Sadece basit bir Dispose yapacak.

kötü

(new SMcMaster.TabOrderManager(this)).SetTabOrder(SMcMaster.TabOrderManager.TabScheme.AcrossFirst); 

iyi

ToolTip T = new ToolTip(); 
T.SetToolTip(btnAddPropertyInvoice, "Add Properties"); 
components.Add(T); 
+1

Birlikte çalıştığınız kontrolde 'Dispose 'i çağırmanız yeterli değil mi? Kontrol, çocuklarını otomatik olarak atmalıdır. Tabii ki, kontrolün düzgün yazıldığını varsayarsak. –

+0

Özel denetimleriniz varsa ve Atmayın veya daha iyisi varsa, ancak bu denetimlerde yapmanız gereken ek elden çıkarma işlemlerini uygulamıyorsanız, kendinizi bu çıkmazda bulabilirsiniz. Varsa, özel kontrol türleri içindeki atın gerçek davranışını doğruladınız mı? Dispose hakkında iyi makale ... http: //blogs.msdn.com/b/jfoscoding/archive/2005/08/12/450835.aspx –

+0

Araç ipuçlarınım yanlış bir şekilde oluşturuyordum. Yanıtlarınız için teşekkürler. –

cevap

1

düzgün Dispose adresleme doğrulayın.

İlgili konular