private void ComputeHashThread() { var threadId = Interlocked.Increment(ref activeComputeHashThreads); Console.WriteLine("HashComputer {0} has started", threadId); FileQueueItem item; byte[] hash; string note; var md5 = MD5.Create(); while (true) { lock (fileQueue.SyncRoot) { if (fileQueue.Count == 0) { if (fileQueue.IsCompleted) { break; } fileQueue.Wait(); } item = fileQueue.Dequeue(); } hash = null; note = ""; try { var stream = File.OpenRead(item.Item1); hash = md5.ComputeHash(stream); stream.Close(); } catch (Exception e) { note = e.Message; } lock (hashQueue.SyncRoot) { hashQueue.Enqueue(new DbQueueItem(item.Item1, hash, note)); hashQueue.Pulse(); } } var threadsRemaining = Interlocked.Decrement(ref activeComputeHashThreads); Console.WriteLine("HashComputer {0} has finished ({1} remaining)", threadId, threadsRemaining); if (threadsRemaining == 0) { lock (hashQueue.SyncRoot) { hashQueue.Complete(); hashQueue.PulseAll(); } } }
private void AsyncScanThread(object paths) { Console.WriteLine("PathScanner has started"); foreach (var path in (string[])paths) { try { var files = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories); foreach (var file in files) { lock (fileQueue.SyncRoot) { fileQueue.Enqueue(new FileQueueItem(file)); fileQueue.Pulse(); } filesFound++; } } catch (UnauthorizedAccessException) { } catch (PathTooLongException) { } catch (DirectoryNotFoundException) { } } lock (fileQueue.SyncRoot) { fileQueue.Complete(); fileQueue.PulseAll(); } Console.WriteLine("PathScanner has finished ({0} files found)", filesFound); }