2008-09-19 31 views
10

Tôi đang làm việc trên ứng dụng WPF đôi khi có các sự cố kỳ lạ và xuất hiện để treo trong giao diện người dùng. Nó không nhất quán, nó xảy ra ở các trang khác nhau, nhưng nó thường xuyên xảy ra đủ để nó là một vấn đề lớn. Tôi nên đề cập rằng nó không phải là một sự thật treo như mô tả dưới đây. Ý tưởng đầu tiên của tôi là hình động của một số nút là vấn đề vì chúng được sử dụng trên hầu hết các trang, nhưng sau khi gỡ bỏ chúng, các lỗi vẫn xảy ra, mặc dù dường như ít thường xuyên hơn một chút. Tôi đã cố gắng đột nhập vào trình gỡ rối khi xảy ra treo; tuy nhiên không bao giờ có bất kỳ mã nào để xem. Không có mã nào của tôi đang chạy. Tôi cũng nhận thấy rằng "treo" không hoàn chỉnh. Tôi có mã cho phép tôi kéo biểu mẫu xung quanh (nó không có đường viền hoặc tiêu đề) tiếp tục hoạt động. Tôi cũng có nút đóng của tôi có chức năng khi tôi nhấp vào nó. Việc nhấp vào các nút xuất hiện để thực sự hoạt động khi mã của tôi chạy, nhưng giao diện người dùng chỉ đơn giản là không bao giờ cập nhật để hiển thị một trang mới.Làm cách nào để khắc phục sự cố giao diện người dùng WPF?

Tôi đang tìm kiếm bất kỳ lời khuyên, công cụ hoặc kỹ thuật nào để theo dõi vấn đề kỳ quặc này, vì vậy nếu bạn có bất kỳ suy nghĩ nào, tôi sẽ đánh giá cao điều đó.

CHỈNH SỬA: Nó chỉ xảy ra lần nữa, vì vậy lần này khi tôi cố gắng đột nhập vào trình gỡ rối tôi đã chọn để "hiển thị tháo gỡ". Nó đưa tôi đến MS.Win32.UnsafeNativeMethods.GetMessageW. Stack trace sau:

[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 bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (hệ thống ref.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 bytes WindowsBase.dll! .Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b byte 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 (đối tượng bỏ qua) + 0x1e bytes
PresentationFramework.dll! System.Windows.Application.RunInternal (Cửa sổ System.Windows.Window) + 0x6f bytes PresentationFramework.dll! System.Windows.Application.Run (Cửa sổ System.Windows.Window) + 0x26 System.Windows.Application.Run byte PresentationFramework.dll!() + 0x19 byte WinterGreen.exe! WinterGreen.App.Main() + 0x5e byte C# [Native để chuyển Managed]
[Managed để Nativ e Transition]
mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly assembly, string [] args) + 0x19 bytes mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (bool checkAptModel) + 0x6e byte mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 byte mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext, string [] activationCustomData) + 0x65 byte mscorlib 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 (trạng thái đối tượng) + 0x66 bytes
mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executeContext, System.Threading.ContextCallback callback, trạng thái đối tượng) + 0x6f bytes
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes

Trả lời

5

Hãy thử loại bỏ hành vi không biên giới của cửa sổ của bạn và xem điều đó có hữu ích không. Ngoài ra, bạn có BeginInvoke() 'ing hoặc Invoke()' trong bất kỳ hoạt động chạy dài nào không?

Một điều cần xem xét: Khi bạn đột nhập vào mã của mình, hãy thử xem các chủ đề khác với chuỗi chính của bạn. Một trong số họ có thể đang chặn chuỗi giao diện người dùng.

+0

Có những lúc một số quá trình không đồng bộ được thực thi; tuy nhiên hành vi này có thể xảy ra bất cứ lúc nào, kể cả ngay sau khi khởi động khi hầu như không có gì được chạy. Tôi sẽ thử xóa hành vi không biên giới. – palehorse

+0

Chỉ cần một lưu ý cho những người khác đọc điều này trong tương lai: Không bao giờ gọi() hoặc BeginInvoke() hoạt động lâu dài trên Dispatcher của bạn. Giao diện người dùng của bạn sẽ xuất hiện để treo ... sử dụng một chủ đề hoặc BackgroundWorker hoặc một cái gì đó tương tự. –

+0

Bob là đúng, nếu bạn đang làm quá nhiều về chuỗi giao diện người dùng tại một thời điểm giao diện người dùng sẽ không phản hồi. Bạn muốn làm ít nhất có thể trên chuỗi giao diện người dùng; bất kỳ hoạt động lớn nào phải được thực hiện trên một chuỗi nền. –

4

Một công cụ tuyệt vời là Snoop. Thực sự tốt đẹp cho việc nhìn vào những gì WPF đối tượng được hiển thị trên cây thị giác tại một thời điểm nhất định. Tôi không chắc nó sẽ giúp ích bao nhiêu, nhưng có thể bạn đang làm kẹt chuỗi giao diện người dùng với rất nhiều thứ mà nó phải làm. Snoop có thể giúp bạn theo dõi những gì trên màn hình để cung cấp cho bạn ý tưởng tìm kiếm những gì.

+0

Snoop có lẽ sẽ không giúp ích gì khi mã bị treo, nhưng người hỏi không thể đột nhập vào hang. –

+0

Tôi đã thử snoop, nhưng như Bob lưu ý, nó không giúp đỡ. Tôi đã nhận thấy một điều khác mà tôi sẽ chỉnh sửa các câu hỏi ban đầu để bao gồm. – palehorse

6

Ứng dụng WPF của bạn có thể bị treo do các vấn đề về hiệu suất. Hãy thử sử dụng Perforator để xem bạn có bất kỳ phần nào được trả lại phần mềm hay không hoặc ứng dụng của bạn có đang sử dụng quá nhiều video ram hay không.

+0

Tôi không biết về công cụ đó. Tôi sẽ cài đặt nó ngay, – palehorse

+0

+1 cho mục đích đề cập đến. 1 công cụ khác trong túi! – Stimul8d

4

Tôi đã xóa hành vi không biên giới theo đề xuất của Bob King. Cho đến nay, điều đó dường như đã loại bỏ được vấn đề.

Bây giờ, câu hỏi là, tại sao và làm cách nào để khắc phục sự cố? Sản phẩm được thiết kế để không có viền với một số góc tròn và các bộ phận trong suốt.

+0

Tôi cũng cần điều này. Tôi đã có chính xác cùng một vấn đề. Tôi nhận thấy một hiệu suất MASSIVE đạt được khi tôi chuyển sang một ứng dụng cửa sổ quá. – Stimul8d

1

Hoan hô, ... có vẻ như vấn đề không liên quan đến cửa sổ không viền (ít nhất là trong trường hợp của tôi).

Có hiệu suất lớn khi bạn đặt AllowsTransparency thành true. Vì vậy, nhiều của một hit nó sẽ có vẻ, rằng toàn bộ điều có thể treo thread UI. Hành vi rất lạ. Có thể liên quan đến this ticket

Các vấn đề liên quan