Kısa Soru
180.000 kez çalışan bir döngüm var. Her yinelemenin sonunda, sonuçların gerçek zamanlı olarak güncellenen bir TextBox'a eklenmesi beklenir.
Kullanımı MyTextBox.Text += someValue, uygulamanın büyük miktarda bellek tüketmesine neden oluyor ve birkaç bin kayıttan sonra kullanılabilir belleği tükeniyor.
TextBox.Text180.000 defaya metin eklemenin daha verimli bir yolu var mı ?
Düzenleme Bu özel durumun sonucunu gerçekten umursamıyorum, ancak bunun neden bir bellek domuzu gibi göründüğünü ve bir TextBox'a metin eklemenin daha verimli bir yolu olup olmadığını bilmek istiyorum.
Uzun (Orijinal) Soru
Bir CSV dosyasındaki kimlik numaralarının listesini okuyan ve her biri için bir PDF raporu oluşturan küçük bir uygulamam var. Her bir pdf dosyası oluşturulduktan sonra, ResultsTextBox.Textişlenen ve başarıyla işlendiği raporun Kimlik Numarası eklenir. Süreç bir arka plan iş parçacığı üzerinde çalışır, bu nedenle ResultsTextBox öğeler işlenirken gerçek zamanlı olarak güncellenir
Şu anda uygulamayı 180.000 kimlik numarasıyla çalıştırıyorum, ancak uygulamanın kapladığı bellek zaman geçtikçe katlanarak artıyor. Yaklaşık 90K ile başlar, ancak yaklaşık 3000 kayıtta yaklaşık 250MB yer kaplar ve 4000 kayıtta uygulama yaklaşık 500 MB bellek kaplar.
Eğer Results TextBox'a yapılan güncellemeyi açıklarsam, bellek yaklaşık 90K'da nispeten sabit kalır, bu yüzden yazmanın ResultsText.Text += someValuehafızayı yemesine neden olduğunu varsayabilirim .
Sorum şu, bu neden? Bellek tüketmeyen bir TextBox.Text'e veri eklemenin daha iyi bir yolu nedir?
Kodum şöyle görünüyor:
try
{
report.SetParameterValue("Id", id);
report.ExportToDisk(ExportFormatType.PortableDocFormat,
string.Format(@"{0}\{1}.pdf", new object[] { outputLocation, id}));
// ResultsText.Text += string.Format("Exported {0}\r\n", id);
}
catch (Exception ex)
{
ErrorsText.Text += string.Format("Failed to export {0}: {1}\r\n",
new object[] { id, ex.Message });
}
Ayrıca, uygulamanın tek seferlik bir şey olduğunu ve tüm raporları oluşturmanın birkaç saat (veya günler :)) almasının önemli olmadığını belirtmek gerekir. Benim asıl endişem, sistem bellek sınırına ulaşırsa çalışmayı durduracak olmasıdır.
Bu şeyi çalıştırmak için yorumlanan Sonuçları TextBox'ı güncelleyen satırı bırakmaktan memnunum, ancak TextBox.Textgelecekteki projelere veri eklemenin daha verimli bir bellek yolu olup olmadığını bilmek istiyorum .
StringBuilderMetni eklemek için a kullanmayı deneyebilir ve tamamlandığındaStringBuilderdeğeri metin kutusuna atayabilirsiniz .