У меня есть следующий код в коде c #, который вычисляет значение свойства:
public class Options
{
public bool UseFeature
{
public bool NoUseFeatureInternal { get; set; }
public bool UseFeatureInternal { get; set; }
get
{
// Command line param
if (NoUseFeatureInternal )
{
return false;
}
// Command line param
if (UseFeatureInternal )
{
return true;
}
if (cachedUseFeature.HasValue)
{
return cachedUseFeature.Value;
}
string userName= Override.GetUserName();
cachedUseFeature = ToolBox.Config.Flights.IsActive("FeatureName", overrideName);
return cachedUseFeature.Value;
}
}
private bool? cachedUseFeature;
}
public static class ToolBox
{
private static Lazy<GlobalConfig> configLazy = new Lazy<GlobalConfig>(() => GlobalConfig.Load() ?? GlobalConfig.Default);
public static GlobalConfigConfig
{
get
{
return configLazy.Value;
}
}
}
public class GlobalConfig
{
public static GlobalConfig Load(string filePath = null)
{
filePath = filePath ?? GetGlobalConfigPath();
if (string.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath))
{
return null;
}
string fileContents = File.ReadAllText(filePath);
// Parses json
return ParseConfig(fileContents);
}
}
Я получаю доступ к значению Options.UseFeature из нескольких задач. У меня, кажется, есть некоторые части программы, где значения оказываются истинными, а некоторые - где ложными, но только в некоторых случаях. Мой мыслительный процесс заключается в том, что я знаю, что из-за нескольких потоков cachedUseFeature = ToolBox.Config.Flights.IsActive("UseFeature", overrideName);
можно вызывать несколько раз. Тем не менее, я не понимаю, как это могло бы дать разные ответы в разное время, как это называется. Решит ли это ленивое значение для cachedUseFeature или что-то еще происходит? Глядя на Является ли Lazy хорошим решением для поточно-ориентированного загруженного синглтона? , я испытываю желание поставить блокировку вокруг Toolbox.Config везде, где он используется, но я не уверен, что этоправильное решение тоже.