public FileConfigurationRepo(string fileName) { if (fileName == null) { throw new ArgumentNullException(nameof(fileName)); } var fullPath = Path.GetFullPath(fileName); _file = new FileInfo(fullPath); _saveLoop = new PartialAwaitableRetry(LoopSyncTask); _keyValueSynchronizer = new FileDictionarySynchronizer <string, string>(_file, #pragma warning disable CS8620 // 由于引用类型的可为 null 性差异,实参不能用于形参。 x => CoinConfigurationSerializer.Serialize(x), #pragma warning restore CS8620 // 由于引用类型的可为 null 性差异,实参不能用于形参。 x => CoinConfigurationSerializer.Deserialize(x), // 因为 COIN 格式的序列化器默认会写“文件头”,导致即使是构造函数也会和原始文件内容不同,于是会写入文件,导致写入次数比预期多一些。 // 所以,比较差异时使用 KeyValueEquals 而不是 WholeTextEquals,这可以在目前对注释不敏感的时候提升一些性能。 FileEqualsComparison.KeyValueEquals); // 监视文件改变。 _watcher = new FileWatcher(_file); _currentReadingFileTask = FastSynchronizeAsync(); _watcher.Changed += OnFileChanged; _ = _watcher.WatchAsync(); }
public FileConfigurationRepo(string fileName) { if (fileName == null) { throw new ArgumentNullException(nameof(fileName)); } var fullPath = Path.GetFullPath(fileName); _file = new FileInfo(fullPath); _saveLoop = new PartialAwaitableRetry(SaveCoreAsync); // 监视文件改变。 _watcher = new FileWatcher(_file); _watcher.Changed += OnFileChanged; _ = _watcher.WatchAsync(); LoadFromFileTask = RequestReloadingFile(); }
/// <summary> /// 初始化使用 <paramref name="fileName"/> 作为配置文件的 <see cref="FileConfigurationRepo"/> 的新实例。 /// </summary> /// <param name="fileName">配置文件的文件路径。</param> public FileConfigurationRepo(string fileName) { if (fileName == null) { throw new ArgumentNullException(nameof(fileName)); } var fullPath = Path.GetFullPath(fileName); _file = new FileInfo(fullPath); _saveLoop = new PartialAwaitableRetry(SaveCoreAsync); // 监视文件改变。 _watcher = new FileWatcher(_file); _watcher.Changed += OnFileChanged; #pragma warning disable 4014 _watcher.WatchAsync(); #pragma warning restore 4014 // 反序列化。 DeserializeTask = Task.Run(async() => await DeserializeFile(_file).ConfigureAwait(false)); }