应用程序启动时发生随机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