2008-09-19 69 views
10

我正在研究WPF應用程序,該應用程序有時會出現奇怪的問題,並且似乎在UI中掛起了。它不一致,它發生在不同的頁面中,但它經常發生,這是一個很大的問題。我應該提到,它不是一個真正的懸掛,如下所述。如何解決WPF UI問題?

我的第一個想法是,一些按鈕的動畫是大多數頁面上使用的問題,但是在刪除它們之後仍會出現掛起,儘管看起來不太常見。發生掛起時,我試圖打入調試器;但是從來沒有任何代碼可以查看。我的代碼沒有運行。我也注意到「掛起」並不完整。我有代碼,可以讓我拖動表單(它沒有邊框或標題),繼續工作。我也有我的贏了關閉按鈕,當我點擊它時發揮作用。點擊按鈕看起來實際上可以在我的代碼運行時正常工作,但UI不會更新以顯示新頁面。

我正在尋找任何建議,工具或技術來追蹤這個奇怪的問題,所以如果你有任何想法,我將不勝感激。

編輯︰它再次發生,所以這次當我試圖打入調試器,我選擇「顯示反彙編」。它帶我到MS.Win32.UnsafeNativeMethods.GetMessageW。堆棧跟蹤如下:

[Managed to Native Transition] 

WindowsBase.dll中MS.Win32.UnsafeNativeMethods.GetMessageW(REF System.Windows.Interop.MSG味精,System.Runtime.InteropServices.HandleRef的HWND,INT uMsgFilterMin,INT uMsgFilterMax )+ 0x15 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg,System.IntPtr hwnd,int minMessage,int maxMessage)+ 0x48 bytes WindowsBase.dll!System .Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame})+ 0x8b bytes WindowsBase.dll!System.Windows.Threading.Dispatcher。 PushFrame(System.Windows.Threading.DispatcherFrame frame)+ 0x49 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run()+ 0x4c bytes
PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore )+ 0x1e bytes
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window)+ 0x6f bytes PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window)+ 0x26字節 PresentationFramework.dll!System.Windows.Application.Run()+ 0x19字節 WinterGreen.exe!WinterGreen.App.Main()+ 0x5e字節C# [原產於託管過渡]
[託管到NATIV e轉換]
mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.Assembly assembly,string [] args)+ 0x19 bytes mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel)+ 0x6e字節 mscorlib.dll中!System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()+的0x84字節 mscorlib.dll中!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext,串[] activationCustomData)+ 0x65字節 mscorlib程序.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext)+ 0xa bytes mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activationContext)+ 0x3e bytes
Microsoft.VisualStudio。 HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()+ 0x23 bytes
mscorlib.dll!System.Threading。ThreadHelper.ThreadStart_Context(object state)+ 0x66 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state)+ 0x6f bytes
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart()+ 0x44字節

回答

5

嘗試刪除窗口的無邊框行爲,看看是否有幫助。另外,您是BeginInvoke()'ing還是Invoke()'長時間運行的操作?

另一個要看的事情是:當你闖入你的代碼時,試着看看你的主線程以外的線程。其中之一可能會阻止UI線程。

+0

有些時候某些異步進程被執行;然而,這種行爲可能隨時發生,包括在啓動後幾乎沒有任何運行時發生。 我會嘗試刪除無邊界行爲。 – palehorse 2008-09-19 18:23:40

+0

僅需注意其他人將來閱讀此內容:從不在調度程序中調用()或BeginInvoke()長時間運行的操作。你的用戶界面似乎掛起...使用線程或BackgroundWorker或類似的東西。 – 2008-09-19 18:25:34

+0

Bob是對的,如果你一次在UI線程上做的太多,UI將變得無法響應。你想在UI線程上做盡可能少的事情;任何大的操作都應該在後臺線程上完成。 – 2008-09-19 18:28:39

4

一個很棒的工具是Snoop。真的很適合查看WPF對象在給定時間在可視化樹上顯示的內容。我不確定它會提供多大的幫助,但是它可能會干擾UI線程並帶來很多額外的事情。 Snoop可以幫助您追蹤屏幕上的內容,爲您提供想法。

+0

由於代碼掛起,探聽者可能無法幫助,但提問者無法進入掛起狀態。 – 2008-09-19 18:23:17

6

由於性能問題,您的WPF應用程序可能會掛起。嘗試使用Perforator來查看是否有任何軟件呈現的部分,或者您的應用是否使用了太多的視頻RAM。

4

我已經刪除了Bob King建議的無邊界行爲。迄今爲止,這似乎已經擺脫了這個問題。

現在的問題是,爲什麼以及如何解決這個問題?該產品設計爲無邊框,有一些圓角和透明部分。

1

好哇,看來這個問題與無邊框窗口無關(至少在我的情況下)。

當您將AllowsTransparency設置爲true時會有很大的性能下降。看起來如此之大,整個事情可能會掛起UI線程。非常奇怪的行爲。可能與this ticket有關