C# 单一实例线程安全变量

本文关键字:安全 变量 线程 实例 单一 | 更新日期: 2023-09-27 18:35:43

我在这里参考了Jon Skeet的文章(http://csharpindepth.com/articles/general/singleton.aspx),第六版。

但是,我有一些私有变量,我想初始化一次,并被这个所谓的单例类中的方法使用。我在私有构造函数中初始化了它们,但很快发现,在多线程方案 (Task.Run) 中调用方法时它们是 null。

调试时,我观察到当我调用"实例

"时,私有构造函数不会调用两次(应该是),因此我假设我的私有变量在那个时间点不应该是空的(成功的"实例"调用)。

关于我应该如何声明、初始化和使用这些变量的任何想法?

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());
    public static Singleton Instance { get { return lazy.Value; } }
    // my private variables
    private readonly string _plantCode;
    private Singleton()
    {
       var appSettings = ConfigurationManager.AppSettings;
       string _plantCode = appSettings["PlantCode"] ?? "Not Found";
    }
    public SomeMethod() 
    {
      var temp = _plantCode; // <== _plantCode becomes null here!
    }
}

C# 单一实例线程安全变量

这是问题所在:

string _plantCode = appSettings["PlantCode"] ?? "Not Found";

这不是分配给实例变量 - 而是声明一个新的局部变量。你只需要:

_plantCode = appSettings["PlantCode"] ?? "Not Found";

(顺便说一下,这将发生在普通类中的相同代码中 - 它与它是单例的事实无关。