static async Task BuildDispatcherLoopAsync() { ITaskHandler2 dispatchStatus = null; while (!QtVsToolsPackage.Instance.Zombied) { while (BuildQueue.IsEmpty || RequestTimer.ElapsedMilliseconds < 1000) { if (BuildQueue.IsEmpty && dispatchStatus != null) { dispatchStatus.Dismiss(); dispatchStatus = null; } await Task.Delay(100); } if (BuildQueue.TryDequeue(out QtProjectBuild buildRequest)) { if (dispatchStatus == null) { dispatchStatus = StatusCenter.PreRegister( new TaskHandlerOptions { Title = "Qt VS Tools", }, new TaskProgressData { ProgressText = string.Format( "Refreshing IntelliSense data, {0} project(s) remaining...", BuildQueue.Count), CanBeCanceled = true }) as ITaskHandler2; dispatchStatus.RegisterTask(new Task(() => throw new InvalidOperationException())); } else { dispatchStatus.Progress.Report( new TaskProgressData { ProgressText = string.Format( "Refreshing IntelliSense data, {0} project(s) remaining...", BuildQueue.Count), CanBeCanceled = true, }); } await buildRequest.BuildAsync(); } if (BuildQueue.IsEmpty || dispatchStatus?.UserCancellation.IsCancellationRequested == true) { if (dispatchStatus != null) { dispatchStatus.Dismiss(); dispatchStatus = null; } Reset(); } } }
void BeginInitStatus() { ThreadHelper.ThrowIfNotOnUIThread(); lock (StaticCriticalSection) { if (InitStatus != null) { return; } try { InitStatus = StatusCenter.PreRegister( new TaskHandlerOptions { Title = "Qt VS Tools: Setting up project tracking..." }, new TaskProgressData { ProgressText = string.Format("{0} ({1} projects remaining)", Project.Name, InitQueue.Count), CanBeCanceled = true, PercentComplete = 0 }) as ITaskHandler2; } catch (Exception e) { Messages.Print( e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace); } InitStatus.RegisterTask(new Task(() => throw new InvalidOperationException())); } }