我已经成为以下类的继承人,该类从文件系统加载XML文件,然后提供对XML的访问。这用于ASP.NET MVC应用程序。显然,意图是每个应用程序上下文只加载一次文档。 LoadXml方法中的错误名称参数xml实际上是一个完整路径 - c:\ a \ b \ c \ d \ file.xml
public class XmlParseService
{
static XmlDocument xdoc;
private static object lockobject = new object();
internal static bool IsdocumentFound
{
get
{
return xdoc != null;
}
}
internal static void LoadXml(String xml)
{
if (xdoc == null)
xdoc = new XmlDocument();
xdoc.Load(xml);
}
public static XmlNodeList GetNodes(string xpath)
{
if (xdoc == null)
return null;
lock (lockobject)
{
return xdoc.SelectNodes(xpath);
}
}
public static String GetInnerText(string xpath)
{
if (xdoc == null)
return String.Empty;
lock (lockobject)
{
XmlNode node = xdoc.SelectSingleNode(xpath);
if (node == null)
return String.Empty;
return node.InnerText;
}
}
public static String GetAttributeText(string xpath, string attribute)
{
if (xdoc == null)
return String.Empty;
lock (lockobject)
{
XmlNode node = xdoc.SelectSingleNode(xpath);
if (node == null)
return String.Empty;
return node.Attributes[attribute].InnerText;
}
}
internal static void LoadXml(FileStream fileStream)
{
if (xdoc == null)
xdoc = new XmlDocument();
xdoc.Load(fileStream);
}
public static string[] GetValues(string xpath)
{
lock (lockobject)
{
XmlNodeList nodes = xdoc.SelectNodes(xpath);
if (nodes == null)
return new String[] { };
string[] s = new string[nodes.Count];
for (int i = 0; i < nodes.Count; i++)
s[i] = nodes[i].InnerText;
return s;
}
}
}
我无法在方法LoadXml中看到代码未被
包围的原因lock (lockobject)
{
....
}
以及为什么if (xdoc == null)
语句没有用lock语句包装。
他们应该吗?如果没有,为什么不呢?它确实需要使用lock
语句吗?
答案 0 :(得分:0)
我无法在方法LoadXml中看到代码未被[...]
包围的原因
据推测,来电者对这种情况有所了解。例如,可能是XML仅在应用程序的应用程序启动事件中加载,并且此时作者知道不会有任何其他线程试图访问该值。当然,加入锁定,即使你知道不会引起争论,也不是一个可怕的想法,因为拿出锁的绝对微不足道的成本并不是很大的回报。知道有人在他们不应该破坏代码时调用该方法的想法。
为什么if(xdoc == null)语句没有用lock语句包装。
这是一项优化。它不是真正的必要的,因为前面提到的锁定成本非常小,但在这种特殊情况下,由于引用的赋值是原子的,因此变量将是{{ 1}}或非空,由于正在进行的分配,它不会有无效值,所以虽然我不认为它是值得的优化,它看起来有效。