将多个singeletion对象存储在只读静态字典线程中是否安全?

时间:2017-01-12 22:49:58

标签: c# asp.net dictionary static thread-safety

我的问题是这个代码线程安全吗?
我尝试将XmlSerializer对象缓存在本地dictionary对象中,以便在需要时可以重用它以避免内存泄漏。由于XmlSerializer将程序集加载到内存中而从不卸载。

字典中将有四个可能的XmlSerializer对象。您可以说在静态构造函数中创建所有四个XmlSerializer(具有不同的构造函数集)对象,并在需要时使用。这样它就是一个线程安全的,因为我们可以保证静态构造函数只运行一次。但是如果没有人使用应用程序的xmlserializer功能会怎么样呢。然后记忆那些消耗的对象将被浪费。

我可以创建线程安全的单例对象。但我对XmlSerializer的上下文更感兴趣。
我经历了很多关于线程安全和锁定的帖子。像这样(http://csharpindepth.com/Articles/General/Singleton.aspx)文章更详细地讲述但是没有特别发现XmlSerialization。

所以任何想法都会受到高度赞赏!

public class SerializeableEntity
{

private readonly static Dictionary<string, XmlSerializer> serializerCache = new Dictionary<string, XmlSerializer>();

public string SerializeIntoXml(SerializeableEntity ObjToSerialize,xmlAttributeOverrides omitProperties,string key)
{
   XmlSerializer serializer=GetSerializerObj(key, ObjToSerialize.GetType(), omitProperties);
//... rest of the logic

}


    private XmlSerializer GetSerializerObj(string key, Type type, XmlAttributeOverrides xmlAttributeOverrides)
    {
        XmlSerializer serializer = null;
        serializerCache.TryGetValue(key, out serializer);
        if (serializer == null)
        {
            serializer = xmlAttributeOverrides != null ? new XmlSerializer(type, xmlAttributeOverrides) : new XmlSerializer(type);
            serializerCache.Add(key, serializer);
        }
        return serializer;
    }
}

0 个答案:

没有答案