Сбой приложения WPF - PullRequest
       6

Сбой приложения WPF

0 голосов
/ 05 января 2010

Я работаю над приложением WPF с TabControl (3 вкладки с textBlocks, метками и dataGrids). Приложение автоматически обновляет данные на этих вкладках, используя фоновые потоки. Все работает отлично, за исключением того факта, что если я переключаю вкладки, когда запускается один из фоновых процессов, он выдает ошибку «Ссылка на объект не установлен на экземпляр объекта» и вылетает приложение. Я настроил DispatcherUnhandledException для обработки любого необработанного исключения в потоке пользовательского интерфейса. Трассировка стека не предоставляет большого количества данных, кроме того факта, что ошибка исходит от TabControl и, возможно, объектов, связанных с выбранной вкладкой. Мой вопрос заключается в следующем: могут ли такие проблемы быть присущи WPF TabControl? Я, как упоминалось ранее, настроил столько обработки ошибок, сколько знаю, но получаю только ошибку «Ссылка на объект ...».

Трассировка стека:

в System.Windows.Controls.ItemContainerGenerator.MoveToPosition (позиция GeneratorPosition, направление GeneratorDirection, логическое значение allowStartAtRealizedItem, GeneratorState & state) в System.Windows.Controls.ItemContainerGenerator.Generator..ctor (фабрика ItemContainerGenerator, позиция GeneratorPosition, направление GeneratorDirection, логическое значение allowStartAtRealizedItem) в System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.StartAt (позиция позиции генератора, направление GeneratorDirection, логическое значение allowStartAtRealizedItem) в System.Windows.Controls.VirtualizingStackPanel.MeasureOverride (ограничение размера) в Microsoft.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride (ограничение размера) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ Примитивы \ DataGridRowsPre: строка в System.Windows.FrameworkElement.MeasureCore (Доступный размер) в System.Windows.UIElement.Measure (Доступный размер) в System.Windows.ContextLayoutManager.UpdateLayout () в System.Windows.ContextLayoutManager.UpdateLayoutCallback (Object arg) в System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork () в System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks () в System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget) в System.Windows.Media.MediaContext.RenderMessageHandler (Object resizedCompositionTarget) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (состояние объекта) в System.Threading.ExecutionContext.runTryCode (объект userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, код возврата CleanupCode, объект userData объекта) в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.ProcessQueue () в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter)в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логический isSingleParameter, делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter, делегат catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, время ожидания TimeSpan, метод Delegate, аргументы объекта, логическое значение isSingleParameter) в System.Windows.Threading.Dispatcher.Invoke (приоритет DispatcherPriority, метод делегата, объектный аргумент) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) в MS.Win32. UnsafeNativeMethods.DispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (фрейм DispatcherFrame) в System.Windows.Threading.Dispatcher.PushFrame (фрейм DispatcherFrame) в System.Windows.Threading.Dispatcher.Run () в System.Windows.Application.RunDispatcher (игнорирование объекта) в System.Windows.Application.RunInternal (окно окна) в System.Windows.Application.Run (окно окна) в System.Windows.Application.Run () в salesforceConnect.App.Main () в C: \ Users \ jfeltis \ Documents \ Expression \ Blend 3 \ Projects \ salesforceConnect \ salesforceConnect \ obj \ Debug \ App.g.cs: строка 0

Все это бред для меня. Может ли кто-нибудь умнее меня взглянуть и, надеюсь, дать мне какое-то направление? Спасибо.

1 Ответ

0 голосов
/ 06 января 2010

Попробуйте установить точку останова в обработчике событий SelectionChanged и сразу после запуска приложения перейти на другую вкладку. У вас есть UserControl на любой из вкладок? Если это так, также установите точку останова в событии Loaded. По крайней мере, когда вы достигнете точки останова, фоновый поток приостановится, и вы сможете увидеть, какой объект является нулевым.

Другой метод грубой силы, который я использую, состоит в том, чтобы закомментировать целые блоки кода, выполнить и протестировать и постепенно раскомментировать построчно, пока не произойдет разрыв. Тогда вы знаете хотя бы одно из возможных мест крушения.

...