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
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
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ự. –
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. –