MVVM体系结构中WPF应用程序中的应用程序崩溃问题

时间:2015-04-07 10:51:34

标签: wpf wcf

最近,我们在应用程序中面临崩溃问题(不定期,通常在客户端),我们无法跟踪错误原因。大多数情况下,我们从日志中获得的错误就是这样......


Type : System.IndexOutOfRangeException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Index was outside the bounds of the array.
Source : mscorlib
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : Void Add(T)
HResult : -2146233080
Stack Trace :    at System.Collections.Generic.List`1.Add(T item)

 System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
   at System.ComponentModel.BackgroundWorker.AsyncOperationCompleted(Object arg)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

另外,为了在应用程序级别处理崩溃,我们在App.xaml.cs文件中编写了某些代码,即

 private void CurrentDomain_UnhandledException(object sender,
                                                  UnhandledExceptionEventArgs e)
    {
        try
        {
            var exception = (Exception) e.ExceptionObject;
            ExceptionHandler.HandleException(exception);
            WpfMessageBox.Show(LocalizationManager.GetValue("AppErrorUnhandledException").ToString(),
                               LocalizationManager.GetValue("AppErrorUnhandledException").ToString(),
                               WpfMessageBoxButtons.OK,
                               WpfMessageBoxIcon.Error);
        }

为了阻止应用程序突然崩溃,我们还有什么需要做的吗?

注意:我们的应用程序基于MVVM模式,概念,如服务外观,统一,服务编排,MutiThreading(使用后台调用服务异步)

P.S:通常根据日志,我们在缓存数据时收到此错误。

1 个答案:

答案 0 :(得分:0)

您的CurrentDomain_UnhandledException将处理来自Dispatcher(UI线程)的异常。 BackgroundWorker是另一个线程,Dispatcher不处理此线程中发生的任何异常,并且系统崩溃。

您应该在正确的线程(后台线程)中处理IndexOutOfRangeException。

NG-HT