C# 是否需要锁定这些静态应用程序属性?

C# 是否需要锁定这些静态应用程序属性?,c#,asp.net,multithreading,thread-safety,locking,C#,Asp.net,Multithreading,Thread Safety,Locking,在我的web应用程序中,我在应用程序启动期间从外部配置文件读取一些设置,然后通过应用程序的多种方法访问它们: namespace Common { public static class CommonConfigSettings { public static string DataSource { get; set; } public static string DatabaseName { get; set; } public

在我的web应用程序中,我在
应用程序启动期间从外部配置文件读取一些设置,然后通过应用程序的多种方法访问它们:

namespace Common
{
    public static class CommonConfigSettings
    {
        public static string DataSource { get; set; }
        public static string DatabaseName { get; set; }
        public static string DatabaseUserName { get; set; }
        public static string DatabasePassword { get; set; }
    }
}
应用程序\u启动期间
将这些从XML文件读取到静态变量中:

DataSource = els.FirstOrDefault(item => item.Attribute("key").Value == "DataSource").Attribute("value").Value;
DatabaseName = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabaseName").Attribute("value").Value;
DatabaseUserName = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabaseUserName").Attribute("value").Value;
DatabasePassword = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabasePassword").Attribute("value").Value;
在应用中,它们的使用方式如下:

myConn.ConnectionString = string.Format("Persist Security Info=False; User ID={0}; Password={1}; Initial Catalog={2}; Data Source={3}; Connection Timeout=60", 
    CommonConfigSettings.DatabaseUserName, 
    CommonConfigSettings.DatabasePassword, 
    CommonConfigSettings.DatabaseName, 
    CommonConfigSettings.DataSource);

在任何时候都不会将静态值写入以下
应用程序\u Start
-它们只会被读出(尽管可能是由2+人同时读出)。也没有静态方法,只有属性。我读过关于锁定和线程安全的文章,但我只是把自己弄糊涂了。我应该对这些值实施锁定吗?如果是,请在什么时候实施锁定?

如果您完全确定这些属性只写入一次(并且在所有读取操作之前),则无需锁定

编辑:问题是:会一直如此吗?如果在运行时需要替换此数据库访问信息,则会遇到非原子操作问题(例如,如果写入线程在正确/错误的时间中断,则会读取新的数据库用户名和旧密码)。可能最好提供一种方法,在单个结构中返回所有需要的数据。如果将来需要,这种方法可以提供线程锁定机制

public struct DatabaseAccessData
{
    public string DataSource { get; set; }
    public string DatabaseName { get; set; }
    public string DatabaseUserName { get; set; }
    public string DatabasePassword { get; set; }
}

public static class CommonConfigSettings
{        
    private static string DataSource { get; set; }
    private static string DatabaseName { get; set; }
    private static string DatabaseUserName { get; set; }
    private static string DatabasePassword { get; set; }

    public static void SetDatabaseAccessData(DatabaseAccessData data)
    {
        DataSource = data.DataSource;
        DatabaseName = data.DatabaseName;
        DatabaseUserName = data.DatabaseUserName;
        DatabasePassword = data.DatabasePassword;
    }

    public static DatabaseAccessData GetDatabaseAccessData()
    {
        return new DatabaseAccessData
        {
            DataSource = DataSource,
            DatabaseName = DatabaseName,
            DatabaseUserName = DatabaseUserName,
            DatabasePassword = DatabasePassword
        };
    }

在这种情况下,我不喜欢“静态”。如果某些类依赖于公共配置设置,则应通过构造函数参数或属性将CommonConfigSettings的实例传递给它们(请参阅“依赖项注入”)。我更喜欢第一种,因为它更严格;那么,你不能忘记传递一个重要的依赖项。

谢谢-知道这一点很好。那么,当同时写入和读取的组合被引入时,是否需要锁定(这是有意义的)?仅针对这种情况进行编辑。;-)是的,如果同时进行写入和读取,则需要一些锁定机制。“在单个结构中返回所有需要的数据”。对不起,你能解释一下这意味着什么吗(这与我正在做的有什么不同)?到目前为止,你的阅读线程正在一个接一个地访问所需的单个属性“DataSource”、“DatabaseName”等(见你的格式调用)。我想说的是:不允许对这些单一属性进行读访问,只允许对“一堆”返回所有所需属性的方法进行访问。这种中央访问方法以后可以更好地控制。。。你知道结构是什么吗?我以为它和类很相似。这就是我问的原因,因为我觉得我的静态类做的和你说的差不多?很抱歉问了这么多问题,我只是想确定我做的是对的