2008-09-19 16 views
10

Bazen garip sorunlar gösteren ve kullanıcı arabiriminde askıda görünen bir WPF uygulaması üzerinde çalışıyorum. Tutarsızdır, farklı sayfalarda olur, ancak genellikle büyük bir problem olduğu için yeterli olur. Aşağıda açıklandığı gibi gerçek bir askı olmadığını belirtmeliyim.WPF UI sorunları nasıl giderilir?

İlk düşüncem, bazı düğmelerin animasyonlarının, çoğu sayfalarda kullanılmaları nedeniyle sorun oluşturmasıydı, ancak bunları kaldırdıktan sonra, hala daha az sıklıkta görünse de, askıda kalıyor. Asılma meydana geldiğinde hata ayıklayıcısını kırmaya çalıştım; Ancak, görüntülenecek hiçbir kod yoktur. Benim hiçbir kodum çalışmıyor. Ayrıca "asmak" ın tamamlanmadığını da fark ettim. Çalışmaya devam eden formu sürüklememe izin veren bir kodum var (sınırsız veya başlığa sahip değil). Ayrıca tıkladığımda çalışan kazanma düğmem var. Düğmeleri tıklamak aslında benim kodumun çalıştığı gibi görünür, ancak kullanıcı arayüzü yeni bir sayfa göstermek için hiçbir zaman güncellenmez.

Bu tuhaf problemi çözmek için herhangi bir tavsiye, araç veya teknik arıyorum, bu yüzden herhangi bir fikriniz varsa, bunu çok takdir edeceğim.

DÜZENLEME: Sadece bir kez daha oldu, bu yüzden hata ayıklayıcısını kırmaya çalıştığımda bu kez "demontajı göstermeyi" seçtim. Bu bana MS.Win32.UnsafeNativeMethods.GetMessageW getiriyor. Yığın izleme aşağıdaki gibidir:!

[Managed to Native Transition] 

WindowsBase.dll MS.Win32.UnsafeNativeMethods.GetMessageW (ref System.Windows.Interop.MSG Msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 bayt
WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 bayt WindowsBase.dll! Sistem .Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame çerçeve = {System.Windows.Threading.DispatcherFrame}) + 0x8b bayt WindowsBase.dll! System.Windows.Threading.Dispatcher. PushFrame (System.Windows.Threading.DispatcherFrame kare) + 0x49 bayt
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run() +
PresentationFramework.dll! System.Windows.Application.RunDispatcher bayt 0x4c (nesne göz ardı) + 0x1e bayt
PresentationFramework.dll! System.Windows.Application.RunInternal (System.Windows.Window penceresi) + 0x6f baytları PresentationFramework.dll! System.Windows.Application.Run (System.Windows.Window penceresi) + 0x26 bayt PresentationFramework.dll! System.Windows.Application.Run() + 0x19 bayt WinterGreen.exe! WinterGreen.App.Main() + 0x5E bayt C# [Yönetilen Geçiş Yerli]
[Nativ başardı e Geçiş]
mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly derleme, string [] args) + 0x19 bayt mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (boole checkAptModel) + 0x6e bayt mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 bayt mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext, dize [] activationCustomData) + 0x65 bayt mscorlib .dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext) + 0xa bayt
Microsoft.VisualStudio bayt 0x3e mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext activationContext) +. HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 bayt
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart_Context (nesne durumu) + 0x66 bayt
mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext ExecutionContext, System.Threading.ContextCallback geri arama, nesne durumu) + 0x6f bayt
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 bayt

cevap

5

Pencerenizin kenarlıksız davranışını kaldırmayı deneyin ve yardımcı olup olmadığını görün. Ayrıca, herhangi bir uzun koşu operasyonu için BeginInvoke() 'ya da Invoke() var mı?

Bakılması gereken başka bir nokta: Kodunuza girdiğinizde, ana diziniz dışındaki konulara bakmayı deneyin. Bunlardan biri UI iş parçacığını engelliyor olabilir.

+0

ile ilgili olabilir Bazı zaman uyumsuz işlemlerin yürütüldüğü zamanlar vardır; Ancak bu davranış, hemen hemen hiçbir şey yapılmadığında başlangıçtan hemen sonra da dahil olmak üzere herhangi bir zamanda ortaya çıkabilir. Kenarlıksız davranışı kaldırmayı deneyeceğim. – palehorse

+0

Gelecekte bunu okuyan diğer insanlara bir not: Asla Rehberinizde asla Invoke() veya BeginInvoke() uzun süreli operasyonlar. UI'niz asılacak gibi görünür ... Bir iş parçacığı veya BackgroundWorker veya benzer bir şey kullanın. –

+0

Bob haklıysa, UI iş parçacığı üzerinde çok fazla şey yapıyorsanız, kullanıcı arabirimi yanıt vermeyecektir. UI iş parçacığı üzerinde mümkün olduğunca az yapmak istersiniz; Herhangi bir büyük operasyon bir arka plan iş parçacığı üzerinde yapılmalıdır. –

4

Harika bir araç Snoop'dur. Belirli bir zamanda görsel ağaç üzerinde WPF nesnelerinin görüntülendiğine bakmak gerçekten çok hoş. Ne kadar yardım edeceğinden emin değilim, ama UI iş parçacığını yapması gereken çok fazla şeyle karıştırmak mümkün. Snoop, ekranda nelerin bulunacağını öğrenmek için ekranda ne olduğunu takip etmenize yardımcı olabilir.

+0

Snoop muhtemelen kodun asılmasından bu yana yardımcı olmaz, ancak soru soranın içine giremez. –

+0

Snoop'u denedim ama Bob'un da belirttiği gibi, yardım etmiyor. Eklenecek orijinal soruyu düzenleyeceğim başka bir şey fark ettim. – palehorse

6

WPF uygulamanız performans sorunları nedeniyle askıda kalabilir. Yazılımın oluşturulduğu herhangi bir parçanız olup olmadığını veya uygulamada çok fazla video ramını kullanıp kullanmadığınızı görmek için Perforator'u kullanmayı deneyin.

+0

Bu aracı bilmedim. Perforatör için kısa bir süre, – palehorse

+0

+ 1 kuracağım. Çantada 1 araç daha var! – Stimul8d

4

Bob King tarafından önerilen sınırsız davranışı kaldırdım. Bugüne kadar, bu problemden kurtulmuş gibi görünüyor.

Şimdi sorun şu ki, neden ve sorunu nasıl düzeltebilirim? Ürün, bazı yuvarlak köşeler ve saydam parçalar ile sınırsız olacak şekilde tasarlanmıştır.

+0

Buna da ihtiyacım var. Tam olarak aynı sorunu yaşadım. Pencereli bir uygulamaya geçtiğimde MASSIVE performans kazancımı da fark ettim. – Stimul8d

1

Yaşasın, ... sorunun kenarsız pencerelerle ilgili olmadığı anlaşılıyor (en azından benim durumumda).

AllowsTransparency değerini true olarak ayarladığınızda büyük bir performans artışı vardır. Bir isabetin çokluğu, tüm şeyin UI iş parçacığını askıya alabileceği gibi görünüyor. Çok tuhaf davranışlar. this ticket