private void OnFileWatcherChanged(object source, FileSystemEventArgs e) { lock (this) { if (e.ChangeType == WatcherChangeTypes.Deleted) { return; } if (_fwatcher != null) { _fwatcher.EnableRaisingEvents = false; } FileObjectEventArgs <T> evArgs = null; try { Core.Log.Warning("File for object {0} => {1}. Reloading file: {2}", typeof(T).Name, e.ChangeType, FilePath); var oldId = _id; var oldValue = _instance; LoadFile(); var newId = _id; var newValue = _instance; Core.Log.Warning("File for object {0} => File loaded.", typeof(T).Name, e.ChangeType); evArgs = new FileObjectEventArgs <T>(FilePath, oldId, oldValue, newId, newValue); } catch (Exception ex) { OnException?.Invoke(this, new EventArgs <Exception>(ex)); FileObjectEvents.FireException(this, ex); Core.Log.Write(ex); } finally { if (_fwatcher != null) { _fwatcher.EnableRaisingEvents = true; } if (evArgs != null) { OnChanged?.Invoke(this, evArgs); FileObjectEvents.FireFileObjectChanged(this, evArgs.FilePath, evArgs.OldId, evArgs.OldValue, evArgs.NewId, evArgs.NewValue); } } } }
private async void Watcher_Error(object sender, ErrorEventArgs e) { try { var watchException = e.GetException(); OnException?.Invoke(this, new EventArgs <Exception>(watchException)); FileObjectEvents.FireException(this, watchException); Try.Do(fw => { if (fw is null) { return; } fw.EnableRaisingEvents = false; fw.Dispose(); }, _fwatcher); _fwatcher = null; var nWatcher = CreateWatcher(); while (!nWatcher.EnableRaisingEvents) { try { nWatcher = CreateWatcher(); } catch { await Task.Delay(500).ConfigureAwait(false); } } _fwatcher = nWatcher; } catch (Exception ex) { Core.Log.Write(ex); } }