public ProgressRefreshThread(ProgressContext context, TimeSpan refreshRate) { _context = context ?? throw new ArgumentNullException(nameof(context)); _refreshRate = refreshRate; _running = new ManualResetEvent(false); _stopped = new ManualResetEvent(false); _thread = new Thread(Run); _thread.IsBackground = true; _thread.Start(); }
public override void Update(ProgressContext context) { lock (_lock) { if (!_stopwatch.IsRunning) { _stopwatch.Start(); } var renderContext = new RenderContext(_console.Profile.Encoding, _console.Profile.Capabilities.Legacy); var delta = _stopwatch.Elapsed - _lastUpdate; _lastUpdate = _stopwatch.Elapsed; var grid = new Grid(); for (var columnIndex = 0; columnIndex < _columns.Count; columnIndex++) { var column = new GridColumn().PadRight(1); var columnWidth = _columns[columnIndex].GetColumnWidth(renderContext); if (columnWidth != null) { column.Width = columnWidth; } if (_columns[columnIndex].NoWrap) { column.NoWrap(); } // Last column? if (columnIndex == _columns.Count - 1) { column.PadRight(0); } grid.AddColumn(column); } // Add rows foreach (var task in context.GetTasks()) { var columns = _columns.Select(column => column.Render(renderContext, task, delta)); grid.AddRow(columns.ToArray()); } _live.SetRenderable(new Padder(grid, new Padding(0, 1))); } }
public override void Update(ProgressContext context) { lock (_lock) { var task = context.GetTasks().SingleOrDefault(); if (task != null) { // Not same description? if (_lastStatus != task.Description) { _lastStatus = task.Description; _renderable = new Markup(task.Description + Environment.NewLine); return; } } _renderable = null; return; } }
public override void Update(ProgressContext context) { lock (_lock) { var hasStartedTasks = false; var updates = new List <(string, double)>(); foreach (var task in context.GetTasks()) { if (!task.IsStarted || task.IsFinished) { continue; } hasStartedTasks = true; if (TryAdvance(task.Id, task.Percentage)) { updates.Add((task.Description, task.Percentage)); } } // Got started tasks but no updates for 30 seconds? if (hasStartedTasks && updates.Count == 0 && (DateTime.Now - _lastUpdate) > TimeSpan.FromSeconds(30)) { foreach (var task in context.GetTasks()) { updates.Add((task.Description, task.Percentage)); } } if (updates.Count > 0) { _lastUpdate = DateTime.Now; } _renderable = BuildTaskGrid(updates); } }
/// <summary> /// Starts the progress task list. /// </summary> /// <param name="action">The action to execute.</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> public async Task StartAsync(Func <ProgressContext, Task> action) { if (action is null) { throw new ArgumentNullException(nameof(action)); } var renderer = CreateRenderer(); renderer.Started(); try { using (new RenderHookScope(_console, renderer)) { var context = new ProgressContext(_console, renderer); if (AutoRefresh) { using (var thread = new ProgressRefreshThread(context, renderer.RefreshRate)) { await action(context).ConfigureAwait(false); } } else { await action(context).ConfigureAwait(false); } context.Refresh(); } } finally { renderer.Completed(AutoClear); } }
public abstract void Update(ProgressContext context);