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); } } }
void RunQueries(object ob) { // DateTime t = DateTime.Now; // Console.WriteLine ("RunQueries started"); do { object query = null; lock (queryQueue) { if (queryQueue.Count == 0) { queryRunning = false; break; } query = queryQueue.Dequeue(); if (query is VersionInfoQuery) { VersionInfoQuery q = (VersionInfoQuery)query; filesInQueryQueue.ExceptWith(q.Paths); } else if (query is DirectoryInfoQuery) { var q = (DirectoryInfoQuery)query; directoriesInQueryQueue.Remove(q.Directory); } } try { if (query is VersionInfoQuery) { VersionInfoQuery q = (VersionInfoQuery)query; var status = OnGetVersionInfo(q.Paths, (q.QueryFlags & VersionInfoQueryFlags.IncludeRemoteStatus) != 0); infoCache.SetStatus(status); } else if (query is DirectoryInfoQuery) { var q = (DirectoryInfoQuery)query; var status = OnGetDirectoryVersionInfo(q.Directory, q.GetRemoteStatus, false); infoCache.SetDirectoryStatus(q.Directory, status, q.GetRemoteStatus); } } catch (Exception ex) { LoggingService.LogError("Version control status query failed", ex); } } while (true); //Console.WriteLine ("RunQueries finished - " + (DateTime.Now - t).TotalMilliseconds); }