Better way of handling progress, and childProgress.

More reliable taskFinishTime
This commit is contained in:
glax 2023-06-11 17:04:33 +02:00
parent 3b2643d949
commit 36f7cbd3e9
5 changed files with 25 additions and 48 deletions

View File

@ -128,7 +128,6 @@ public class TaskManager
DateTime.Now.Subtract(removeTask.Key.lastChange) > TimeSpan.FromMinutes(3))//3 Minutes since last update to task -> remove DateTime.Now.Subtract(removeTask.Key.lastChange) > TimeSpan.FromMinutes(3))//3 Minutes since last update to task -> remove
{ {
logger?.WriteLine(this.GetType().ToString(), $"Disposing failed task {removeTask.Key}."); logger?.WriteLine(this.GetType().ToString(), $"Disposing failed task {removeTask.Key}.");
removeTask.Key.parentTask?.DecrementProgress(removeTask.Key.progress);
removeTask.Value.Cancel(); removeTask.Value.Cancel();
toRemove.Add(removeTask.Key); toRemove.Add(removeTask.Key);
} }

View File

@ -23,50 +23,31 @@ public abstract class TrangaTask
public Task task { get; } public Task task { get; }
public string taskId { get; set; } public string taskId { get; set; }
[Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; } [Newtonsoft.Json.JsonIgnore]public ExecutionState state { get; set; }
[Newtonsoft.Json.JsonIgnore]public double progress { get; protected set; } [Newtonsoft.Json.JsonIgnore]protected HashSet<TrangaTask> childTasks { get; }
[Newtonsoft.Json.JsonIgnore]public double progress => childTasks.Count > 0 ? childTasks.Sum(childTask => childTask.progress) / childTasks.Count : _myProgress;
[Newtonsoft.Json.JsonIgnore]private double _myProgress = 0;
[Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence); [Newtonsoft.Json.JsonIgnore]public DateTime nextExecution => lastExecuted.Add(reoccurrence);
[Newtonsoft.Json.JsonIgnore]public DateTime executionStarted { get; private set; } [Newtonsoft.Json.JsonIgnore]public DateTime executionStarted { get; private set; }
[Newtonsoft.Json.JsonIgnore] [Newtonsoft.Json.JsonIgnore]
public DateTime executionApproximatelyFinished => this.progress != 0 public DateTime executionApproximatelyFinished => this.progress != 0
? this.executionStarted.Add(DateTime.Now.Subtract(this.executionStarted) / this.progress) ? this.executionStarted.Add(DateTime.Now.Subtract(this.executionStarted).Divide(this.progress))
: DateTime.MaxValue; : DateTime.MaxValue;
[Newtonsoft.Json.JsonIgnore] [Newtonsoft.Json.JsonIgnore]public TimeSpan executionApproximatelyRemaining => this.executionApproximatelyFinished.Subtract(DateTime.Now);
public TimeSpan executionApproximatelyRemaining => this.executionApproximatelyFinished.Subtract(DateTime.Now);
[Newtonsoft.Json.JsonIgnore]public DateTime lastChange { get; private set; } [Newtonsoft.Json.JsonIgnore]public DateTime lastChange { get; private set; }
public enum ExecutionState public enum ExecutionState { Waiting, Enqueued, Running }
{
Waiting,
Enqueued,
Running
};
protected TrangaTask(Task task, TimeSpan reoccurrence) protected TrangaTask(Task task, TimeSpan reoccurrence)
{ {
this.reoccurrence = reoccurrence; this.reoccurrence = reoccurrence;
this.lastExecuted = DateTime.Now.Subtract(reoccurrence); this.lastExecuted = DateTime.Now.Subtract(reoccurrence);
this.task = task; this.task = task;
this.progress = 0f;
this.executionStarted = DateTime.Now; this.executionStarted = DateTime.Now;
this.lastChange = DateTime.MaxValue; this.lastChange = DateTime.MaxValue;
this.taskId = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(this.executionStarted.ToString(CultureInfo.InvariantCulture))); this.taskId = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(this.executionStarted.ToString(CultureInfo.InvariantCulture)));
} this.childTasks = new();
public double IncrementProgress(double amount)
{
this.progress += amount;
this.lastChange = DateTime.Now;
return this.progress;
}
public double DecrementProgress(double amount)
{
this.progress -= amount;
this.lastChange = DateTime.Now;
return this.progress;
} }
/// <summary> /// <summary>
@ -95,10 +76,22 @@ public abstract class TrangaTask
logger?.WriteLine(this.GetType().ToString(), $"Finished Executing Task {this}"); logger?.WriteLine(this.GetType().ToString(), $"Finished Executing Task {this}");
} }
/// <returns>True if elapsed time since last execution is greater than set interval</returns> public void ReplaceFailedChildTask(DownloadChapterTask failed, DownloadChapterTask newTask)
public bool ShouldExecute()
{ {
return nextExecution < DateTime.Now && state is ExecutionState.Waiting; if (!this.childTasks.Contains(failed))
throw new ArgumentException($"Task {failed} is not childTask of {this}");
this.childTasks.Remove(failed);
this.childTasks.Add(newTask);
}
public void AddChildTask(DownloadChapterTask childTask)
{
this.childTasks.Add(childTask);
}
public void IncrementProgress(double amount)
{
this._myProgress += amount;
} }
public enum Task : byte public enum Task : byte

View File

@ -11,6 +11,7 @@ public class DownloadChapterTask : TrangaTask
public Chapter chapter { get; } public Chapter chapter { get; }
[JsonIgnore]public DownloadNewChaptersTask? parentTask { get; set; } [JsonIgnore]public DownloadNewChaptersTask? parentTask { get; set; }
public string? parentTaskId { get; set; } public string? parentTaskId { get; set; }
[JsonIgnore]public new double progress { get; private set; }
public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", DownloadNewChaptersTask? parentTask = null) : base(task, TimeSpan.Zero) public DownloadChapterTask(Task task, string connectorName, Publication publication, Chapter chapter, string language = "en", DownloadNewChaptersTask? parentTask = null) : base(task, TimeSpan.Zero)
@ -21,6 +22,7 @@ public class DownloadChapterTask : TrangaTask
this.language = language; this.language = language;
this.parentTask = parentTask; this.parentTask = parentTask;
this.parentTaskId = parentTask?.taskId; this.parentTaskId = parentTask?.taskId;
this.progress = 0;
} }
protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null) protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null)

View File

@ -8,15 +8,11 @@ public class DownloadNewChaptersTask : TrangaTask
public string connectorName { get; } public string connectorName { get; }
public Publication publication { get; } public Publication publication { get; }
public string language { get; } public string language { get; }
[JsonIgnore]private HashSet<DownloadChapterTask> childTasks { get; }
[JsonIgnore]public new double progress => childTasks.Count > 0 ? childTasks.Sum(childTask => childTask.progress) / childTasks.Count : 0;
public DownloadNewChaptersTask(Task task, string connectorName, Publication publication, TimeSpan reoccurrence, string language = "en") : base(task, reoccurrence) public DownloadNewChaptersTask(Task task, string connectorName, Publication publication, TimeSpan reoccurrence, string language = "en") : base(task, reoccurrence)
{ {
this.connectorName = connectorName; this.connectorName = connectorName;
this.publication = publication; this.publication = publication;
this.language = language; this.language = language;
this.childTasks = new();
} }
protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null) protected override void ExecuteTask(TaskManager taskManager, Logger? logger, CancellationToken? cancellationToken = null)
@ -42,19 +38,6 @@ public class DownloadNewChaptersTask : TrangaTask
} }
} }
public void ReplaceFailedChildTask(DownloadChapterTask failed, DownloadChapterTask newTask)
{
if (!this.childTasks.Contains(failed))
throw new ArgumentException($"Task {failed} is not childTask of {this}");
this.childTasks.Remove(failed);
this.childTasks.Add(newTask);
}
public void AddChildTask(DownloadChapterTask childTask)
{
this.childTasks.Add(childTask);
}
/// <summary> /// <summary>
/// Updates the available Chapters of a Publication /// Updates the available Chapters of a Publication
/// </summary> /// </summary>

View File

@ -14,6 +14,6 @@ public class UpdateLibrariesTask : TrangaTask
return; return;
foreach(LibraryManager lm in taskManager.settings.libraryManagers) foreach(LibraryManager lm in taskManager.settings.libraryManagers)
lm.UpdateLibrary(); lm.UpdateLibrary();
this.progress = 1f; IncrementProgress(1);
} }
} }