最近,我们在应用程序中面临崩溃问题(不定期,通常在客户端),我们无法跟踪错误原因。大多数情况下,我们从日志中获得的错误就是这样......
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:通常根据日志,我们在缓存数据时收到此错误。
答案 0 :(得分:0)
您的CurrentDomain_UnhandledException将处理来自Dispatcher(UI线程)的异常。 BackgroundWorker是另一个线程,Dispatcher不处理此线程中发生的任何异常,并且系统崩溃。
您应该在正确的线程(后台线程)中处理IndexOutOfRangeException。
NG-HT