コード例 #1
0
        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();
        }
コード例 #2
0
        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)));
            }
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        /// <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);
            }
        }
コード例 #6
0
 public abstract void Update(ProgressContext context);