//======================================================================================== // Methods //======================================================================================== /// <summary> /// This is the worker method for the Librarian background thread. It implements /// a continual loop waiting for scanning tasks to perform. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; while (!worker.CancellationPending) { scanner = queue.Dequeue(); if (worker.CancellationPending) { break; } if (watcher != null) { // Disable the watcher while scanning is active. This way we won't have // file lock contentions or complex threading issues. watcher.EnableRaisingEvents = false; } ProgressChangedEventHandler progressHandler = new ProgressChangedEventHandler(DoScannerProgressChanged); scanner.ProgressChanged += progressHandler; worker.ReportProgress(10, new ScanningProgress(ScannerState.Beginning, scanner.Name)); try { scanner.Execute(); } catch (Exception exc) { App.LogException(new SmartException(exc)); } RemoveScanner(scanner); if (watcher != null) { watcher.EnableRaisingEvents = true; } worker.ReportProgress(100, new ScanningProgress(ScannerState.Completed, scanner.Name)); lock (sync) { scanner.ProgressChanged -= progressHandler; scanner = null; } } }