Better way of handling progress, and childProgress.
More reliable taskFinishTime
This commit is contained in:
parent
3b2643d949
commit
36f7cbd3e9
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user