当线程访问JSON加载的设置时,这些设置不是当前的/更新的/正确的



我有一个使用topshelf的服务,它使用FileSystemWatcher来查找创建的文件,并对它们进行处理。

服务设置存储并加载在JSON文件中。

启动服务时,将从文件加载设置,并填充设置类值。

在调试时,它运行良好,在发布并作为服务运行时,它使用TempFolder属性的默认值。

为什么会失败,以及如何正确加载设置?

[JsonObject(MemberSerialization.OptIn)]
public class MonitorSettings
{
public readonly string SettingsFileName = "Settings.json";
private string SettingsFilePath;
[JsonProperty]
public string FolderToMonitor { get; set; } = @"C:temp";
[JsonProperty]
public string FileNameSearchWildcard { get; set; } = @"*_something.txt";
[JsonProperty]
public string TempFolder { get; set; } = @"C:Temp_Fix_This_Path";
public MonitorSettings()
{
SettingsFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData, Environment.SpecialFolderOption.None), SettingsFileName);
}
public bool Load()
{
if (!File.Exists(SettingsFilePath))
{
Save();
return false;
}
var json = File.ReadAllText(SettingsFilePath);
JsonConvert.PopulateObject(json, this);
return true;
}

json文件的内容

{
"FolderToMonitor": "C:\results",
"FileNameSearchWildcard": "*_blah.txt",
"TempFolder": "D:\Temp\temp"
}

服务启动:


private volatile MonitorSettings _Settings;
public bool Start()  //entry point Service Start
{
_CTS = new CancellationTokenSource();
Task.Run(()=>StartService(_CTS.Token));
return true;        
}
public async Task StartService(CancellationToken token)
{
_Settings = new MonitorSettings();
if (!_Settings.Load())
{
WriteEventLog($"Settings file not setup. Go To %AppData% and edit: {_Settings.SettingsFileName}",EventLogEntryType.Error,0);
throw new Exception($"Settings File Not Found, Go To AppData and edit {_Settings.SettingsFileName}");
}
CheckSettings(_Settings);

if (!Directory.Exists(_Settings.TempFolder))
{
Directory.CreateDirectory(_TempFolder);
}
WriteEventLog($"Starting {appName}. Monitoring: {_Settings.FolderToMonitor} | Copying to: {_Settings.TempFolder}", EventLogEntryType.Information,1); //TempFolder is not the value from the JSON file
try
{
using (var watcher = new FileSystemWatcher())
{
watcher.Path = _Settings.FolderToMonitor;
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
watcher.IncludeSubdirectories = false;//true;
watcher.Created += Watcher_Changed;
//start it
watcher.EnableRaisingEvents = true;
while (!token.IsCancellationRequested) { await Task.Delay(TimeSpan.FromSeconds(15), token); };
}
}
finally
{
WriteEventLog($"{appName} Service Stop Requested.", EventLogEntryType.Information, 1);
}
}

直接的问题是使用Environment.SpecialFolder.ApplicationData以保存特定于用户的设置文件。

改变为CCD_ 2是非用户特定的;普通的";该文件的位置,更适合这种情况。

最新更新