public void Start() { if (CurrentState.Settings == null) { throw new InvalidOperationException("Unable to start. " + "No configuration set."); } if (!Directory.Exists(CurrentState.Settings.BasePath)) { throw new InvalidOperationException("Unable to start. " + "Base path is not valid."); } if (DedupTask != null && !DedupTask.IsCompleted) { return; } FileWatcher.Path = CurrentState.Settings.BasePath; FileWatcher.IncludeSubdirectories = CurrentState.Settings.Recursive; FileWatcher.EnableRaisingEvents = CurrentState.Settings.MonitorChanges; if (NewFiles != null) { foreach (var kvp in NewFiles) { kvp.Key.Dispose(); } } NewFiles = new ConcurrentDictionary <VideoFile, byte> { }; if (DeletedFiles != null) { foreach (var kvp in DeletedFiles) { kvp.Key.Dispose(); } } DeletedFiles = new ConcurrentDictionary <VideoFile, byte> { }; lock (DedupLock) { DedupTask?.Dispose(); CancelSource = new CancellationTokenSource(); DedupTask = Task.Factory.StartNew( ProcessFolder, CancelSource.Token); } }
public void Stop() { FileWatcher.EnableRaisingEvents = false; if (DedupTask == null || DedupTask.IsCompleted) { return; } CancelSource.Cancel(); try { DedupTask?.Wait(); } catch (AggregateException exc) { exc.Handle(x => x is OperationCanceledException); } CancelSource?.Dispose(); OnStopped(); }
protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { CancelSource.Cancel(); try { DedupTask?.Wait(); } catch (AggregateException exc) { exc.Handle(x => x is OperationCanceledException); } CancelSource?.Dispose(); DedupTask?.Dispose(); FileWatcher?.Dispose(); // TODO: dispose managed state (managed objects) } disposedValue = true; } }