void RunQueries (object ob)
{
// DateTime t = DateTime.Now;
// Console.WriteLine ("RunQueries started");
VersionInfoQuery [] fileQueryQueueClone;
DirectoryInfoQuery [] directoryQueryQueueClone;
RecursiveDirectoryInfoQuery [] recursiveDirectoryQueryQueueClone = new RecursiveDirectoryInfoQuery[0];
try {
while (true) {
lock (queryLock) {
if (fileQueryQueue.Count == 0 &&
directoryQueryQueue.Count == 0 &&
recursiveDirectoryQueryQueue.Count == 0) {
queryRunning = false;
return;
}
fileQueryQueueClone = fileQueryQueue.ToArray ();
fileQueryQueue.Clear ();
filesInQueryQueue.Clear ();
directoryQueryQueueClone = directoryQueryQueue.ToArray ();
directoriesInQueryQueue.Clear ();
directoryQueryQueue.Clear ();
recursiveDirectoryQueryQueueClone = recursiveDirectoryQueryQueue.ToArray ();
recursiveDirectoriesInQueryQueue.Clear ();
recursiveDirectoryQueryQueue.Clear ();
}
// Ensure we do not execute this with the query lock held, otherwise the IDE can hang while trying to add
// new queries to the queue while long-running VCS operations are being performed
var groups = fileQueryQueueClone.GroupBy (q => (q.QueryFlags & VersionInfoQueryFlags.IncludeRemoteStatus) != 0);
foreach (var group in groups) {
var status = OnGetVersionInfo (group.SelectMany (q => q.Paths), group.Key);
infoCache.SetStatus (status);
}
foreach (var item in directoryQueryQueueClone) {
var status = OnGetDirectoryVersionInfo (item.Directory, item.GetRemoteStatus, false);
infoCache.SetDirectoryStatus (item.Directory, status, item.GetRemoteStatus);
}
foreach (var item in recursiveDirectoryQueryQueueClone) {
try {
item.Result = OnGetDirectoryVersionInfo (item.Directory, item.GetRemoteStatus, true);
} finally {
item.ResetEvent.Set ();
}
}
}
} catch (Exception ex) {
LoggingService.LogError ("Version control status query failed", ex);
//Release all items in current batch
foreach (var item in recursiveDirectoryQueryQueueClone)
item.ResetEvent.Set ();
lock (queryLock) {
queryRunning = false;
fileQueryQueue.Clear ();
filesInQueryQueue.Clear ();
directoriesInQueryQueue.Clear ();
directoryQueryQueue.Clear ();
recursiveDirectoryQueryQueueClone = recursiveDirectoryQueryQueue.ToArray ();
recursiveDirectoriesInQueryQueue.Clear ();
recursiveDirectoryQueryQueue.Clear ();
}
//Release newly pending
foreach (var item in recursiveDirectoryQueryQueueClone)
item.ResetEvent.Set ();
}
//Console.WriteLine ("RunQueries finished - " + (DateTime.Now - t).TotalMilliseconds);
}