private void MergeDiskNodes(HierarchyNode curParent, string dir) { var merger = new DiskMerger(this, curParent, dir); while (merger.ContinueMerge()) { } }
private void OnIdle(object sender, ComponentManagerEventArgs e) { Interlocked.Exchange(ref _idleTriggered, 0); do { BoldDeferredItems(); using (new DebugTimer("ProcessFileChanges while Idle", 100)) { if (IsClosed) { return; } DiskMerger merger; FileSystemChange change = null; lock (_fileSystemChanges) { merger = _currentMerger; if (merger == null) { if (_fileSystemChanges.Count == 0) { break; } change = _fileSystemChanges.Dequeue(); } } if (merger != null) { // we have more file merges to process, do this // before reflecting any other pending updates... if (!merger.ContinueMerge()) { _currentMerger = null; } continue; } #if DEBUG try { #endif if (change._type == WatcherChangeTypes.All) { _currentMerger = new DiskMerger(this, this, ProjectHome); continue; } else { change.ProcessChange(); } #if DEBUG } catch (Exception ex) { Debug.Fail("Unexpected exception while processing change: {0}", ex.ToString()); throw; } #endif } } while (e.ComponentManager.FContinueIdle() != 0); }
/// <summary> /// When the file system watcher buffer overflows we need to scan the entire /// directory for changes. /// </summary> private void WatcherError(object sender, ErrorEventArgs e) { lock (_fileSystemChanges) { _fileSystemChanges.Clear(); // none of the other changes matter now, we'll rescan the world _currentMerger = null; // abort any current merge now that we have a new one _fileSystemChanges.Enqueue(new FileSystemChange(this, WatcherChangeTypes.All, null)); TriggerIdle(); } }