MonoDevelop.VersionControl.Repository.RunQueries C# (CSharp) Méthode

RunQueries() static private méthode

static private RunQueries ( object ob ) : void
ob object
Résultat void
		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);
		}