应用程序启动时发生随机InvalidOperationException

我在生产机器上不时遇到应用程序启动时遇到的问题。 每次应用程序启动时都不会发生,而且显然它只在重新启动时发生。 该应用程序从登录开始,添加到HKLM SOFTWARE Microsoft Windows CurrentVersion Run。

显然,重置机器时的问题比重启时更为频繁。 崩溃后手动启动应用程序是成功的。

启动期间引发以下异常:

'System.Windows.Controls.TextBlock'的初始化引发了一个异常。 System.Windows.Markup.XamlParseException:初始化'System.Windows.Controls.TextBlock'引发异常。 ---> System.InvalidOperationException:调用线程无法访问此对象,因为不同的线程拥有它。 在System.Windows.Threading.Dispatcher.VerifyAccess()在System.Windows.Style.Seal()在System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe,FrameworkContentElement fce,样式oldStyle,样式newStyle,样式和styleCache)在System.Windows .FrameworkElement.OnStyleChanged(DependencyObject的d,DependencyPropertyChangedEventArgs e)上System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)上System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)上System.Windows.Controls.TextBlock.OnPropertyChanged(DependencyPropertyChangedEventArgs e)上System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata metadata,EffectiveValueEntry oldEntry,EffectiveValueEntry&newEntry,Boolean coerceWithDeferredReference,Boolean coerceWithCurrentValue,OperationType operationType)System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) 在System.Windows.FrameworkElement.OnInitialized(EventArgs e)在System.Windows.FrameworkElement.TryFireInitialized()在System.Windows.FrameworkElement System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp)在System.Windows.FrameworkElement.UpdateStyleProperty() .InndInit()at MS.Internal.Xaml.Runtime.ClrObjectRuntime.InitializationGuard(XamlType xamlType,Object obj,Boolean begin)---内部异常堆栈跟踪结束---在System.Windows.Markup.XamlReader.RewrapException(Exception System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,IXamlObjectWriterFactory writerFactory,Boolean skipJournaledProperties,Object rootObject,XamlObjectWriterSettings settings,Uri baseUri)在System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader ,布尔skipJournaledProperties,对象rootObject,XamlAccessLevel accessLevel,Uri baseUri)在System.Windows.Markup.XamlReader.LoadBaml(流stream,ParserContext p arserContext,Object parent,Boolean closeStream)在System.Windows.Application.LoadComponent(Object component,Uri resourceLocator) 在Exception.Occurs.At.Different.Origins.Between.Startup()

从StackTrace中可以看出,更新样式缓存时会发生一些事情。 我无法在我自己的电脑上重现这一点。 在启动应用程序时没有涉及这些线程,但有几个AppDomain。 异常的来源并不总是相同,但它与Application.LoadComponent(Object component,Uri resourceLocator)完全相同,

由于我们的应用程序需要根据操作系统从不同于可执行文件(.. ProgramData ....)的位置找到配置文件,因此我们使用单独的AppDomain来指示它在何处查找配置文件,因为我们无法找到告诉ConfigurationManager在哪里查找文件的更好的解决方案。 当然,这可能与此有关,但不一定。 编辑:ConfigurationManager.OpenMappedExeConfiguration似乎不工作,因为它不会刷新通过Properties.Settings.Default访问任何用户或应用程序设置等。

有没有人有任何建议或建议如何处理? 对不起,我无法为您提供重现样本。


这种例外是因为你正在修改不是视觉元素的视觉元素。 我知道这是因为在你的例外的第一行中,它说:

Initialization of 'System.Windows.Controls.TextBlock' threw an exception. System.Windows.Markup.XamlParseException: Initialization of 'System.Windows.Controls.TextBlock' threw an exception. ---> System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.

所有其他的例外情况都没有关系。 我认为这是当你加载初始配置,然后你使用其他线程。 随机行为可能是在加载TextBlock控件之前找到配置的一段时间,所以这次不会抛出异常。

为了解决这个问题,请看看这个问题,以及我给出的最后一个答案(使用SynchronizationContext那个,它真的与使用多个线程的WPF应用程序一起使用)。 如果不清楚评论,我会在这里写解决方案。

希望这个答案有助于发现随机错误,它是好消息...


我不确定是什么导致了这个异常,但我有一个解决方法来解决你的问题。

您可以使用ConfigurationManager.OpenMappedExeConfiguration,它允许您从本地文件系统的任何位置加载任何.config文件,而不是创建单独的AppDomain来加载不同的配置文件。

你这样使用它:

//Map the new configuration file.
var configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = @"c:myOther.config"};

//Get the mapped configuration file
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

使用config.GetSection()来获取只读使用的特定部分,或直接使用config对象在运行时更改配置。

而且你不需要不同的AppDomain,这意味着更快的启动时间:)


摆脱用于指定配置文件的额外AppDomain,并将其替换为此链接中指定的方法来解决该问题。

链接地址: http://www.djcxy.com/p/30523.html

上一篇: Random InvalidOperationException on application startup

下一篇: WPF Application level ViewModel