Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态对象线程安全_C#_Multithreading_Static_Thread Safety_Static Members - Fatal编程技术网

C# 静态对象线程安全

C# 静态对象线程安全,c#,multithreading,static,thread-safety,static-members,C#,Multithreading,Static,Thread Safety,Static Members,我有一个预加载的静态xmldocument对象,它有错误代码和它的描述, 若我正在使用多线程应用程序并试图获取特定错误代码的错误代码描述,那个么我是否需要锁定该方法 这里是我的代码简介(PLS。忽略GETError CODEFREST方法的实现,只考虑使用了OXMLDOC), 预加载的静态XML文档 \u oXmlDoc 稍后我调用GetErrorCodeDescription方法来获得这样的错误代码描述 Public string GetErrorCodeDescription(string

我有一个预加载的静态xmldocument对象,它有错误代码和它的描述, 若我正在使用多线程应用程序并试图获取特定错误代码的错误代码描述,那个么我是否需要锁定该方法

这里是我的代码简介(PLS。忽略GETError CODEFREST方法的实现,只考虑使用了OXMLDOC),

预加载的静态XML文档 \u oXmlDoc

稍后我调用GetErrorCodeDescription方法来获得这样的错误代码描述

Public string GetErrorCodeDescription(string errorCode)
{
string errorDEscption="";

    XmlNodeList elemList = **_oXmlDoc**.GetElementsByTagName(errorCode);

    for (int i=0; i < elemList.Count; i++)
    {   
      errorDEscption=elemList[i].InnerXml);
    }  

return errorDEscption;

}
公共字符串GetErrorCodeDescription(字符串错误代码)
{
字符串errorDEscption=“”;
XmlNodeList elemList=***\u oXmlDoc**.GetElementsByTagName(错误代码);
for(int i=0;i
您最好只解析一次XML,并将所有错误代码和相应的描述放入字典中。如果你使用它,你应该是安全的

线程安全

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的任何实例成员都不能保证线程安全。


因此,不,在没有锁定的情况下,静态实例的使用不能保证线程安全。

@user3597242文档中没有关于读取操作线程安全的规定。例如,查询对象可能会使用非线程安全集合构建缓存。形式正确,但这是MSDN上的模板文本。如果只读不安全,我会感到惊讶,但唯一能确保的方法是检查源代码或找到更具权威性的声明。@HenkHolterman我想你很难找到比文档更能保证线程安全的人。就我所理解的.NET内存模型而言,如果构建对象和读取对象之间没有任何区别,那么当在另一个CPU上进行第一次读取时,它可能会不完全写入内存。这不一定是个问题,但很难排除,并且在出现问题时很难发现。请注意,我正在windows服务启动事件中构造/加载xmldocument,之后,加载的静态实例将在timer_tick threads中使用上述代码。由于它是在单线程环境中创建的,并且是在多线程环境中读取的,所以我觉得它是线程安全的。如果我错了,请纠正我。@user3597242可能是,但不能保证线程安全。即使是现在,它也可能在未来的.NET版本中发生变化。文档没有说任何一种方式,他们只是说“不要假设它是”。ConcurrentDictionary速度太慢了。普通字典是线程安全的。