1

我不时在生产机器上的应用程序启动时遇到问题。并非每次应用程序启动时都会发生这种情况,显然它只会在重新启动时发生。应用程序从登录开始,添加到 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, Style oldStyle, Style newStyle, Style& styleCache) 在 System.Windows .FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) 在 System.Windows.FrameworkElement。 在 Exception.Occurs.At.Different.Origins.Between.Startup()

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

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

有没有人对如何处理这个问题有任何建议或建议?抱歉,我无法为您提供重现的样本。

4

3 回答 3

1

该异常是因为您正在从不是可视线程的线程中修改可视元素。我知道这一点,因为在你的例外的第一行它说:

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 应用程序)。如果不清楚评论,我会在这里写下解决方案。

希望这个答案有助于找到随机错误,这是最糟糕的......

于 2012-11-23T18:21:07.553 回答
0

摆脱用于指定配置文件的额外 AppDomain 并用此链接中指定的方法替换它可以解决问题。

于 2013-01-09T16:27:48.513 回答
0

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

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

你像这样使用它:

//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,这意味着更快的启动时间:)

于 2012-11-22T23:16:35.130 回答