2011-07-08 19 views
12

Belirli bir dizeyi ve yazı tipini, metni kesmeden belirli bir kutuyu dolduracak şekilde kullanacak en büyük boyutu bulan özel bir yöntemim var. Bunu test etmek için birkaç farklı dizgede ve birkaç farklı yazı tipinde dolaşan ve Paralel.For döngüsünde bunların toplu işlerini yapan bir hizmet oluşturdum. Bu hizmet çalışırken, sistemdeki tüm CPU çekirdeği% 90-% 100'dür. 8 veya 9 saat koştuktan sonra, istisnalar atmaya başlayacak. Yine de çoğu zaman işe yarayacak, ancak ara sıra istisna ya da istisnalar ortaya çıkacak."İşlem başarıyla tamamlandı" özel durumu

En içteki istisna, "İşlem başarıyla tamamlandı" mesajına sahiptir ve bir FormattedText nesnesindeki WidthIncludingTrailingWhitespace erişimcisinden kaynaklanmaktadır. Bu araştırma ise

at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d) 
    at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks) 
    at System.Windows.Threading.Dispatcher..ctor() 
    at System.Windows.Threading.Dispatcher.get_CurrentDispatcher() 
    at System.Windows.Media.TextFormatting.TextFormatter.FromCurrentDispatcher(TextFormattingMode textFormattingMode) 
    at System.Windows.Media.FormattedText.LineEnumerator..ctor(FormattedText text) 
    at System.Windows.Media.FormattedText.DrawAndCalculateMetrics(DrawingContext dc, Point drawingOffset, Boolean getBlackBoxMetrics) 
    at System.Windows.Media.FormattedText.get_Metrics() 
    at System.Windows.Media.FormattedText.get_WidthIncludingTrailingWhitespace() 
    ...My Library Here... 

, ben gönülsüz çizim nesneleri (Grafik, Simgeler, vs) bunun için yaygın nedeni olduğunu buldum ama kullanımda herhangi Tek nesneleri bulamadık: Çağrı yığını buna benzemez. Metin boyutlandırma kodu WPF sınıflarını (FontFamily, FormattedText ve Typeface) kullanır ve bunların hiçbiri IDisposable uygulamaz.

İşlemi izlemek için perfmon var, bellek kullanımı, işlem sayısı ve iplik sayısı biraz değişiyor olsa da, hiçbir zaman kontrolden çıkmıyorlar. Bu bana muhtemelen bir sap kaçak olmadığını söylüyor. Başka ne olabilir ki?

GÜNCELLEŞTİRME: Birkaç günlüğüne testi şu an önemli bir değişiklikle çalıştırıyorum: Paralel yerine bir düzenli değil. Henüz çökmedi ve perfmon yatay çizgileri çok az varyansla gösteriyor. Belki de bu WPF metin oluşturma değil, paralelleştirme ile ilgili bir sorundur?

cevap

0

WPF, yeni bir Dispatcher için yerel Win32 penceresi tanıtıcı ayırmaya çalıştığında istisna kaldırıldı. Belki de işleminiz için maksimum miktarda tutamağa ulaştınız?

Her yinelemede çöp toplama işlemini zorlamayı denediniz mi? Çoğu WPF sınıfı IDisposable'ı uygulamamaktadır, ancak yine de WPF içinde yönetilen yönetilmeyen kaynakları kullanırlar.

Hayal edebileceğim başka bir akış yolu var. CurrentDispatcher özelliği, her iş parçacığı için yeni bir Dispatcher oluşturur. Her Dispatcher asla InvokeShutdown çağrılıncaya kadar durmaz. Yani, bir Dispatcher'ın çalıştığı bir iş parçacığının hiçbir zaman sonlandırılmayacağı anlamına gelir, çünkü Pencere yoktur ve Kapat düğmesine basılacak kimse yoktur. Belki de Paralel zorlar. Uygulama için yeni bir Dispatcher'a ve yeni bir tanıtıcıya ihtiyaç duyan bir sonraki iterasyon için yeni bir Thread atamak için. Maalesef Paralel'i kullanma konusunda fazla tecrübem yok, bu yüzden bu sadece bir varsayım.

+0

Süreç üzerinde çalışan perfmonum var ve tanıtıcı kullanımı çok fazla yukarı ve aşağı zıplıyor - yükselme eğilimi yok, bu yüzden sorun olduğunu düşünmüyorum. Çöp toplama işlemini periyodik olarak zorlamayı denedim - yardımcı olmadı. Bu son öneri ilginç. Perfmon, iplikler ile herhangi bir yükseliş trendi göstermez, ancak bu, herhangi bir şekilde iyi bir liderdir. Teşekkürler! –

İlgili konular