gpt4 book ai didi

C# 资源字典 XamlParseException - 线程安全?

转载 作者:行者123 更新时间:2023-11-30 18:41:16 26 4
gpt4 key购买 nike

我正在使用静态资源字典,它按以下方式初始化:

static ResourceDictionary resource = new ResourceDictionary() 
{
Source = new Uri(
"pack://application:,,,/CommonResources;component/ApplicationData.xaml")
};

代码在过去的几个月里一直运行良好,但在过去的几天里我开始遇到以下问题:

Exception of type 'System.Xaml.XamlParseException' was thrown. at System.Windows.Baml2006.Baml2006Reader.ReadObject(KeyRecord record) at System.Windows.ResourceDictionary.CreateObject(KeyRecord key) at System.Windows.ResourceDictionary.RealizeDeferContent(Object key, Object& value, Boolean& canCache) at System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache) at System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache)

除了上面的初始化之外,通过访问所需的项目从字典中读取数据:

if (resource.Contains(key))
{
return resource[key];
}

对代码的唯一修改可能与多个线程同时访问字典有关。同样重要的是要提到,相同的代码有时可以完美运行,有时会抛出上述异常(非常不一致)。

对于异常本身或一般问题的任何见解,我将不胜感激。

最佳答案

ResourceDictionary 与 Dictionary 非常不同。当您从 ResourceDictionary 读取一个值时,如果它没有给定键的缓存值,它将从 xaml 中解析该值。

ResourceDictionary 使用的 xaml 解析器不是线程安全的。在 ReadObject 方法中(抛出 XamlParseException 的地方),它首先查找 xaml 读取流中值所在的位置。然后它在该位置解析 xaml。

如果两个线程同时尝试从 ResourceDictionary 中获取值,线程 A 将查找对象 A 的位置并开始读取。然后线程 B 会将流的读取位置移动到对象 B 的位置,而线程 A 正在读取对象 A。因此您会得到 XamlParseException。

关于C# 资源字典 XamlParseException - 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com