void AddQuery(object query) { lock (queryLock) { if (query is VersionInfoQuery) { VersionInfoQuery vi = (VersionInfoQuery)query; vi.Paths.RemoveAll(p => filesInQueryQueue.Contains(p) || directoriesInQueryQueue.Contains(p.ParentDirectory)); if (vi.Paths.Count == 0) { return; } filesInQueryQueue.UnionWith(vi.Paths); fileQueryQueue.Enqueue(vi); // Console.WriteLine ("GetVersionInfo AddQuery " + string.Join (", ", vi.Paths.Select (p => p.FullPath))); } else if (query is DirectoryInfoQuery) { DirectoryInfoQuery di = (DirectoryInfoQuery)query; if (!directoriesInQueryQueue.Add(di.Directory)) { return; } directoryQueryQueue.Enqueue(di); // Console.WriteLine ("GetDirectoryVersionInfo AddQuery " + ((DirectoryInfoQuery)query).Directory); } if (!queryRunning) { queryRunning = true; System.Threading.ThreadPool.QueueUserWorkItem(RunQueries); } } }
public VersionInfo[] GetDirectoryVersionInfo(FilePath localDirectory, bool getRemoteStatus, bool recursive) { try { if (recursive) { return(OnGetDirectoryVersionInfo(localDirectory, getRemoteStatus, recursive)); } var status = infoCache.GetDirectoryStatus(localDirectory); if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) { return(status.FileInfo); } // If there is no cached status, query it asynchronously DirectoryInfoQuery q = new DirectoryInfoQuery() { Directory = localDirectory, GetRemoteStatus = getRemoteStatus }; AddQuery(q); // If we have a status value but the value was invalidated (RequiresRefresh == true) // then we return the invalidated value while we start an async query to get the new one if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) { return(status.FileInfo); } return(new VersionInfo[0]); } finally { //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds); } }
public VersionInfo[] GetDirectoryVersionInfo(FilePath localDirectory, bool getRemoteStatus, bool recursive) { try { if (recursive) { RecursiveDirectoryInfoQuery rq = AcquireLockForQuery(localDirectory, getRemoteStatus); rq.ResetEvent.WaitOne(); lock (queryLock) if (Interlocked.Decrement(ref rq.Count) == 0) { rq.ResetEvent.Dispose(); } return(rq.Result); } var status = infoCache.GetDirectoryStatus(localDirectory); if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) { return(status.FileInfo); } // If there is no cached status, query it asynchronously DirectoryInfoQuery q = new DirectoryInfoQuery() { Directory = localDirectory, GetRemoteStatus = getRemoteStatus }; AddQuery(q); // If we have a status value but the value was invalidated (RequiresRefresh == true) // then we return the invalidated value while we start an async query to get the new one if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) { return(status.FileInfo); } return(new VersionInfo[0]); } finally { //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds); } }
public VersionInfo[] GetDirectoryVersionInfo (FilePath localDirectory, bool getRemoteStatus, bool recursive) { try { if (recursive) { RecursiveDirectoryInfoQuery rq = AcquireLockForQuery (localDirectory, getRemoteStatus); rq.ResetEvent.WaitOne (); lock (queryLock) if (Interlocked.Decrement (ref rq.Count) == 0) rq.ResetEvent.Dispose (); return rq.Result; } var status = infoCache.GetDirectoryStatus (localDirectory); if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) return status.FileInfo; // If there is no cached status, query it asynchronously DirectoryInfoQuery q = new DirectoryInfoQuery () { Directory = localDirectory, GetRemoteStatus = getRemoteStatus }; AddQuery (q); // If we have a status value but the value was invalidated (RequiresRefresh == true) // then we return the invalidated value while we start an async query to get the new one if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) return status.FileInfo; return new VersionInfo[0]; } finally { //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds); } }
public VersionInfo[] GetDirectoryVersionInfo (FilePath localDirectory, bool getRemoteStatus, bool recursive) { try { if (recursive) return OnGetDirectoryVersionInfo (localDirectory, getRemoteStatus, recursive); var status = infoCache.GetDirectoryStatus (localDirectory); if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) return status.FileInfo; // If there is no cached status, query it asynchronously DirectoryInfoQuery q = new DirectoryInfoQuery () { Directory = localDirectory, GetRemoteStatus = getRemoteStatus }; AddQuery (q); // If we have a status value but the value was invalidated (RequiresRefresh == true) // then we return the invalidated value while we start an async query to get the new one if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus)) return status.FileInfo; else return new VersionInfo[0]; } finally { //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds); } }