System.Threading.ThreadAbortException в System.Windows.Markup.WpfXamlLoader.Load при перезапуске приложения. - PullRequest
3 голосов
/ 07 декабря 2011

Я создал приложение WPF, которое запускается при запуске Windows.Приложение проверяет список файлов в системе и, если какой-либо файл отсутствует, оно выдает путь к файлу.

Проблема, с которой я сталкиваюсь, - это когда я перезагружаю систему во время работы приложения, при перезапуске происходит сбой моего приложенияSystem.Threading.ThreadAbortException.Ниже приведена трассировка стека, которую я получаю в журналах событий

Application: FileValidator.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Threading.ThreadAbortException
Stack:
   at System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
   at System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
   at System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
   at System.Windows.Application.LoadComponent(System.Uri, Boolean)
   at System.Windows.Application.DoStartup()
   at System.Windows.Application.<.ctor>b__1(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   at System.Threading.ExecutionContext.runTryCode(System.Object)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(System.Object)
   at System.Windows.Application.RunInternal(System.Windows.Window)
   at System.Windows.Application.Run(System.Windows.Window)
   at System.Windows.Application.Run()
   at FileValidator.App.Main()

В чем проблема, кто-нибудь сталкивался с этой проблемой раньше ???

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Невозможно дать окончательный ответ без дополнительной отладочной информации или кода, но это звучит как проблема с CLR. Например, если ваше приложение выполняется до полной инициализации среды CLR, вы можете столкнуться с исключением, подобным тому, которое вы получаете здесь. Поскольку WPF - это прежде всего управляемый код, я бы сказал, что это вполне вероятная возможность.

Я бы порекомендовал вам переместить начальную запись с HKLM на HKCU. Таким образом, он должен быть загружен при входе пользователя в систему, а не при запуске Windows, что должно означать, что CLR будет инициализирован к этому моменту.

Если это не сработает, MSDN рекомендует сделать попытку / поймать исключения ThreadAbortException. Я не могу вспомнить до предела, поддерживает ли WPF обработку или нет, но если это так, то я бы сказал, что это будет вашим лучшим выбором, если перемещение выполнения в часть входа пользователя в стек загрузки не исправит это.

Полезные источники:

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx

Загружается ли CLR и инициализируется каждый раз при загрузке нового управляемого приложения?

0 голосов
/ 13 декабря 2011

Можете ли вы проверить некоторые подробности

  • Есть ли какое-то внутреннее исключение?
  • Есть ли какие-либо записи в журнале системных событий.
  • Пожалуйста, настройте счетчики производительности и проверьте на наличие сбоев (perfmon.exe) clr
  • Надеюсь, вы знаете о событиях в классе Application, таких как DispatcherUnhandledException. Пожалуйста, подпишитесь на них. Это поможет отловить исключение, которое пропущено в try {} catch {}
...