2010-01-05 2 views
0

TabControl (textBlocks, labels 및 dataGrids가있는 3 개의 탭)이있는 WPF 응용 프로그램에서 작업하고 있습니다. 응용 프로그램은 백그라운드 스레드를 사용하여 이러한 탭의 데이터를 자동 새로 고칩니다. 배경 프로세스 중 하나가 실행될 때 탭을 전환하면 "개체 참조가 개체 인스턴스로 설정되지 않았습니다."오류가 발생하고 응용 프로그램이 충돌한다는 사실을 제외하면 모든 것이 효과적입니다. DispatcherUnhandledException을 설정하여 UI 스레드에서 처리되지 않은 예외를 처리했습니다. 스택 추적은 오류가 TabControl 및 가능한 경우 선택한 탭과 관련된 사실을 나타내는 것 이외의 많은 데이터를 제공하지 않습니다. 내 질문은 :이 문제가 발생할 수있는 WPF TabControl 그들의 고유 한 문제가 있습니까? 이전에 언급했듯이, 내가 알고있는 것처럼 많은 오류 처리를 설정했지만 그 중 수신 된 것은 모두 "Object reference ..."오류입니다.WPF 응용 프로그램 충돌이 발생했습니다.

스택 트레이스 :

System.Windows.Controls.ItemContainerGenerator.Generator..ctor에서 System.Windows.Controls.ItemContainerGenerator.MoveToPosition (GeneratorPosition 위치 GeneratorDirection 방향 부울 allowStartAtRealizedItem, GeneratorState & 상태) (AT System.Windows.Controls에서 System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.StartAt (GeneratorPosition 위치 GeneratorDirection 방향 부울 allowStartAtRealizedItem) 에서 ItemContainerGenerator 공장 GeneratorPosition 위치 GeneratorDirection 방향 부울 allowStartAtRealizedItem) .Virtualiz WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \에있는 Microsoft.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride (크기 제약 조건)에서 을 ingStackPanel.MeasureOverride (크기 제약 조건) 라인 System.Windows.ContextLayoutManager.UpdateLayout() 에서 System.Windows.UIElement.Measure (크기 availableSize) 에서 System.Windows.FrameworkElement.MeasureCore (크기 availableSize) System.Windows에서 : 프리미티브 DataGridRowsPresenter.cs을 \ .ContextLayoutManager.UpdateLayoutCallback System.Windows.Media.MediaContext.RenderMessageHandlerCore에서 System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() 에서 System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork() 에서 (개체 ARG) (개체 resizedComposit System.Windows.Threading.ExceptionWrapper.InternalRealCall에서 System.Windows.Media.MediaContext.RenderMessageHandler (개체 resizedCompositionTarget) 에서 ionTarget) (위임 콜백 (System.Windows.Threading.ExceptionWrapper.TryCatchWhen에 인수, 부울 isSingleParameter) 객체 개체 소스, 위임 콜백, System.Windows.Threading.DispatcherOperation.InvokeImpl에서 개체 인수, 부울 isSingleParameter, 위임 catchHandler) System.Windows.Threading.Dispatcher.WrappedInvoke에서 (위임 콜백, 인수, 부울 isSingleParameter, 위임 catchHandler 객체) () at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext (개체 상태) at System.Threading.ExecutionContext.runTryCode (Object userData) at System.Runtime.C ompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup, System.Threading.ExecutionContext.Run (ExecutionContext에 ExecutionContext에, ContextCallback 콜백에서 을 (상태 객체의 ExecutionContext의 ExecutionContext, ContextCallback 콜백) System.Threading.ExecutionContext.RunInternal에서 (TryCode 코드 CleanupCode backoutCode는 userData에 개체) 개체 상태) at System.Windows.Threading.DispatcherOperation.Invoke()at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, 부울 & 처리 MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, 부울 & 처리됨)에서 MS에서.System.Windows.Threading.ExceptionWrapper.InternalRealCall (Delegate 콜백, Object args, Boolean isSingleParameter)에서 에 Win32.HwndSubclass.DispatcherCallbackOperation (Object o) 에서 System.Windows.Threading.ExceptionWrapper.TryCatchWhen (개체 소스, 대리자 콜백, 개체 args , Boolean isSingleParameter, Delegate catchHandler) System.Windows.Threading.Dispatcher.WrappedInvoke (대리자 콜백, 개체 args, 부울 isSingleParameter, Delegate catchHandler)에서 at System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority 우선 순위, TimeSpan 시간 제한, 대리인 메서드, 개체 args, 부울 isSingleParameter) 012.Windows.Threading.Dispatcher.Invoke (DispatcherPriority 우선 순위, 대리 메서드, 개체 arg)에서 MS.Win32.HwndSubclass.SubclassWndProc에서 (IntPtr hwnd, Int32 msg, IntPtr wParam, In 시스템에서 System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame 프레임)에서 System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame 프레임)에서 MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & MSG) 에서 TPTR의 lParam) System.Windows.Application.Run에서 System.Windows.Application.RunInternal (윈도우 창) 에서 System.Windows.Application.RunDispatcher에서 .Windows.Threading.Dispatcher.Run() (Object가 무시) (윈도우 창) C : \ Users \ jfeltis \ Documents \ Expression \ Blend 3 \ Projects \ salesforceConnect \ salesforceConnect \ obj \ Debug \ App.g.cs의 salesforceConnect.App.Main()에서 System.Windows.Application.Run()에서 : 0 행

이 모든 것은 나에게 횡설수설합니다. 나보다 똑똑한 사람이 내 모습을보고, 희망을 갖고 내게 어떤 방향을 제시 할 수 있습니까? 고맙습니다.

+1

예외를 발생시키는 행 주위에 코드를 게시 할 수 있습니까? – ChrisF

+0

코드를 사용하지 않고 그냥 추측하고 있지만 문제는 스레딩 문제가 될 것이라고 생각합니다. – ChrisF

+0

또한 피사체에 더 많은 빛을 줄 수있는 내부 예외가있을 수 있습니다. 내 생각 엔 당신이 시간에 보이지 않는 컨트롤을 업데이트하려고 시도하고 있다는 것입니다. 빠른 해결책 : 존재하는지 확인하십시오. 보다 복잡한 솔루션 : 자체 (예 : ContentControl)를 업데이트하고 원시 데이터에 바인딩하는 컨트롤을 사용하십시오. – Will

답변

0

SelectionChanged 이벤트 처리기에 중단 점을 넣고 응용 프로그램이 시작되자 마자 다른 탭을 클릭하십시오. 탭에 UserControl이 있습니까? 그렇다면 Loaded 이벤트에도 중단 점을 넣으십시오. 최소한 중단 점에 도달하면 백그라운드 스레드가 일시 중지되고 어떤 오브젝트가 null인지 볼 수 있습니다.

내가 사용하는 또 다른 무차별 방식은 코드 블록 전체를 주석 처리하고 실행 및 테스트 한 다음 중단 될 때까지 점진적으로 주석을 제거하는 것입니다. 그런 다음 잠재적 인 충돌 위치 중 적어도 하나를 알고 있습니다.