Archived
Added document generation
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
using System.Text;
|
||||
|
||||
namespace CLI.Monitor;
|
||||
|
||||
public class CompactCliTaskMonitor : TaskMonitor
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public CompactCliTaskMonitor(IEnumerable<(string? Name, Task Task)> tasks) : base(tasks) { }
|
||||
|
||||
/// <inheritdoc />
|
||||
public CompactCliTaskMonitor(IEnumerable<Task> tasks) : base(tasks) { }
|
||||
|
||||
#region Overrides of TaskMonitor
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnUpdate(ICollection<(string? Name, Task Task)> tasks)
|
||||
{
|
||||
int completed = 0;
|
||||
int total = tasks.Count;
|
||||
|
||||
var sb = new StringBuilder(total * 30);
|
||||
|
||||
foreach (var (_, task) in tasks)
|
||||
{
|
||||
var status = task.Status;
|
||||
|
||||
if (status > TaskStatus.WaitingForChildrenToComplete)
|
||||
{
|
||||
completed++;
|
||||
}
|
||||
|
||||
sb.Append(task.Exception is not null ? 'X' : StatusMap[status].First());
|
||||
}
|
||||
|
||||
sb.AppendLine($" ({completed}/{total - 1})");
|
||||
|
||||
Console.Clear();
|
||||
Console.Write(sb.ToString());
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -2,5 +2,7 @@
|
||||
|
||||
public interface ITaskMonitor
|
||||
{
|
||||
Task Run();
|
||||
}
|
||||
TimeSpan Interval { get; init; }
|
||||
|
||||
Task Run();
|
||||
}
|
||||
|
||||
@@ -2,9 +2,14 @@
|
||||
|
||||
public abstract class TaskMonitor : ITaskMonitor
|
||||
{
|
||||
protected static IReadOnlyDictionary<TaskStatus, string> StatusMap { get; } =
|
||||
new Dictionary<TaskStatus, string>
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public TimeSpan Interval { get; init; } = TimeSpan.FromSeconds(1);
|
||||
|
||||
private readonly ICollection<(string? Name, Task Task)> _tasks;
|
||||
|
||||
protected static IReadOnlyDictionary<TaskStatus, string> StatusMap { get; } =
|
||||
new Dictionary<TaskStatus, string>
|
||||
{
|
||||
{ TaskStatus.RanToCompletion, "DONE" },
|
||||
{ TaskStatus.Faulted, "FAULT" },
|
||||
{ TaskStatus.Canceled, "CANCL" },
|
||||
@@ -13,27 +18,25 @@ public abstract class TaskMonitor : ITaskMonitor
|
||||
{ TaskStatus.WaitingForActivation, "WAIT" },
|
||||
{ TaskStatus.Running, "RUN" },
|
||||
{ TaskStatus.WaitingForChildrenToComplete, "RUN" },
|
||||
};
|
||||
};
|
||||
|
||||
private readonly ICollection<(string? Name, Task Task)> _tasks;
|
||||
protected TaskMonitor(IEnumerable<(string? Name, Task Task)> tasks) => _tasks = tasks.ToArray();
|
||||
|
||||
protected TaskMonitor(IEnumerable<(string? Name, Task Task)> tasks) => _tasks = tasks.ToArray();
|
||||
protected TaskMonitor(IEnumerable<Task> tasks) :
|
||||
this(tasks.Select(t => (t.Id.ToString(), t))!)
|
||||
{ }
|
||||
|
||||
protected TaskMonitor(IEnumerable<Task> tasks) :
|
||||
this(tasks.Select(t => (t.Id.ToString(), t))!)
|
||||
{ }
|
||||
public Task Run()
|
||||
{
|
||||
var waitTask = Task.WhenAll(_tasks.Select(i => i.Task));
|
||||
|
||||
public Task Run()
|
||||
while (!waitTask.Wait(Interval))
|
||||
{
|
||||
var waitTask = Task.WhenAll(_tasks.Select(i => i.Task));
|
||||
|
||||
while (!waitTask.Wait(TimeSpan.FromSeconds(1)))
|
||||
{
|
||||
OnUpdate(_tasks);
|
||||
}
|
||||
|
||||
return waitTask;
|
||||
OnUpdate(_tasks);
|
||||
}
|
||||
|
||||
protected abstract void OnUpdate(ICollection<(string? Name, Task Task)> tasks);
|
||||
}
|
||||
return waitTask;
|
||||
}
|
||||
|
||||
protected abstract void OnUpdate(ICollection<(string? Name, Task Task)> tasks);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user