Beispiel #1
0
 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);
 }