private void ProcessFailedWatchersQueue(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; IDirectoryWatcher watcher = null; bool enqueueWatcher = true; do { if (this._failedWatchers.TryDequeue(out watcher)) { try { var errArgs = watcher.CheckMonitoredPath().Result; if (errArgs == null) {// no errors detected watcher.InitializeWatcher(); watcher.FileArrivedAsync += HandleFileArrivalAsync; watcher.ErrorAsync += HandleWatcherErrorAsync; watcher.IsEnabled = true; watcher.CheckForExistingFiles(); enqueueWatcher = false; } } catch { // log error } finally { if (enqueueWatcher) { this._failedWatchers.Enqueue(watcher); } else { // log re init } } } } while (watcher != null); }