Compare commits

..

No commits in common. "edc24fff5b346b708e824ed7138fd406f2727579" and "a4c9168551e0d1572819607c25a117e13a0fb6a1" have entirely different histories.

4 changed files with 30 additions and 32 deletions

View File

@ -55,25 +55,22 @@ public class TaskManager
private void TaskCheckerThread() private void TaskCheckerThread()
{ {
logger?.WriteLine(this.GetType().ToString(), "Starting TaskCheckerThread."); logger?.WriteLine(this.GetType().ToString(), "Starting TaskCheckerThread.");
int waitingTasksCount = _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting); int allTasksWaitingLength = _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting);
while (_continueRunning) while (_continueRunning)
{ {
foreach (TrangaTask waitingButExecute in _allTasks.Where(taskQuery => TrangaTask[] tmp = _allTasks.Where(taskQuery =>
taskQuery.nextExecution < DateTime.Now && taskQuery.nextExecution < DateTime.Now &&
taskQuery.state is TrangaTask.ExecutionState.Waiting)) taskQuery.state is TrangaTask.ExecutionState.Waiting or TrangaTask.ExecutionState.Enqueued)
{ .OrderBy(tmpTask => tmpTask.nextExecution).ToArray();
waitingButExecute.state = TrangaTask.ExecutionState.Enqueued; foreach (TrangaTask task in tmp)
}
foreach (TrangaTask task in _allTasks.Where(enqueuedTask => enqueuedTask.state is TrangaTask.ExecutionState.Enqueued))
{ {
task.state = TrangaTask.ExecutionState.Enqueued;
switch (task.task) switch (task.task)
{ {
case TrangaTask.Task.DownloadNewChapters: case TrangaTask.Task.DownloadNewChapters:
if (!_allTasks.Any(taskQuery => if (!_allTasks.Any(taskQuery => taskQuery.task == TrangaTask.Task.DownloadNewChapters &&
taskQuery.task == TrangaTask.Task.DownloadNewChapters && taskQuery.state is TrangaTask.ExecutionState.Running &&
taskQuery.state is TrangaTask.ExecutionState.Running && ((DownloadNewChaptersTask)taskQuery).connectorName == ((DownloadNewChaptersTask)task).connectorName))
((DownloadNewChaptersTask)taskQuery).connectorName == ((DownloadNewChaptersTask)task).connectorName))
{ {
ExecuteTaskNow(task); ExecuteTaskNow(task);
} }
@ -82,7 +79,8 @@ public class TaskManager
if (!_allTasks.Any(taskQuery => if (!_allTasks.Any(taskQuery =>
taskQuery.task == TrangaTask.Task.DownloadChapter && taskQuery.task == TrangaTask.Task.DownloadChapter &&
taskQuery.state is TrangaTask.ExecutionState.Running && taskQuery.state is TrangaTask.ExecutionState.Running &&
((DownloadChapterTask)taskQuery).connectorName == ((DownloadChapterTask)task).connectorName)) ((DownloadChapterTask)taskQuery).connectorName ==
((DownloadChapterTask)task).connectorName))
{ {
ExecuteTaskNow(task); ExecuteTaskNow(task);
} }
@ -93,7 +91,7 @@ public class TaskManager
} }
} }
HashSet<DownloadChapterTask> failedToRemove = new(); HashSet<DownloadChapterTask> toRemove = new();
foreach (KeyValuePair<DownloadChapterTask, CancellationTokenSource> removeTask in _runningDownloadChapterTasks) foreach (KeyValuePair<DownloadChapterTask, CancellationTokenSource> removeTask in _runningDownloadChapterTasks)
{ {
if (removeTask.Key.GetType() == typeof(DownloadChapterTask) && if (removeTask.Key.GetType() == typeof(DownloadChapterTask) &&
@ -101,22 +99,22 @@ public class TaskManager
{ {
logger?.WriteLine(this.GetType().ToString(), $"Disposing failed task {removeTask.Key}."); logger?.WriteLine(this.GetType().ToString(), $"Disposing failed task {removeTask.Key}.");
removeTask.Value.Cancel(); removeTask.Value.Cancel();
failedToRemove.Add(removeTask.Key); toRemove.Add(removeTask.Key);
} }
} }
foreach (DownloadChapterTask taskToRestart in failedToRemove) foreach (DownloadChapterTask taskToRemove in toRemove)
{ {
DeleteTask(taskToRestart); DeleteTask(taskToRemove);
DownloadChapterTask newTask = new (taskToRestart.task, taskToRestart.connectorName, DownloadChapterTask newTask = new (taskToRemove.task, taskToRemove.connectorName,
taskToRestart.publication, taskToRestart.chapter, taskToRestart.language, taskToRemove.publication, taskToRemove.chapter, taskToRemove.language,
(DownloadNewChaptersTask?)taskToRestart.parentTask); (DownloadNewChaptersTask?)taskToRemove.parentTask);
AddTask(newTask); AddTask(newTask);
taskToRestart.parentTask?.ReplaceFailedChildTask(taskToRestart, newTask); taskToRemove.parentTask?.ReplaceFailedChildTask(taskToRemove, newTask);
} }
if(waitingTasksCount != _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting)) if(allTasksWaitingLength != _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting))
ExportDataAndSettings(); ExportDataAndSettings();
waitingTasksCount = _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting); allTasksWaitingLength = _allTasks.Count(task => task.state is TrangaTask.ExecutionState.Waiting);
Thread.Sleep(1000); Thread.Sleep(1000);
} }
} }
@ -133,8 +131,8 @@ public class TaskManager
{ {
task.Execute(this, this.logger, cToken.Token); task.Execute(this, this.logger, cToken.Token);
}, cToken.Token); }, cToken.Token);
if(task is DownloadChapterTask chapterTask) if(task.GetType() == typeof(DownloadChapterTask))
_runningDownloadChapterTasks.Add(chapterTask, cToken); _runningDownloadChapterTasks.Add((DownloadChapterTask)task, cToken);
t.Start(); t.Start();
} }

View File

@ -69,7 +69,7 @@ public abstract class TrangaTask
this.executionStarted = DateTime.Now; this.executionStarted = DateTime.Now;
this.lastChange = DateTime.Now; this.lastChange = DateTime.Now;
ExecuteTask(taskManager, logger, cancellationToken); ExecuteTask(taskManager, logger, cancellationToken);
while(childTasks.Any(ct => ct.state is ExecutionState.Enqueued or ExecutionState.Running)) while(this.childTasks.Any(childTask => childTask.state is ExecutionState.Running or ExecutionState.Enqueued))
Thread.Sleep(1000); Thread.Sleep(1000);
this.lastExecuted = DateTime.Now; this.lastExecuted = DateTime.Now;
this.state = ExecutionState.Waiting; this.state = ExecutionState.Waiting;

View File

@ -30,9 +30,6 @@ public class DownloadChapterTask : TrangaTask
if(this.parentTask is not null) if(this.parentTask is not null)
this.parentTask.state = ExecutionState.Waiting; this.parentTask.state = ExecutionState.Waiting;
taskManager.DeleteTask(this); taskManager.DeleteTask(this);
if(parentTask is not null)
foreach(NotificationManager nm in taskManager.settings.notificationManagers)
nm.SendNotification("New Chapter downloaded", $"{this.publication.sortName} {this.chapter.chapterNumber} {this.chapter.name}");
} }
public override string ToString() public override string ToString()

View File

@ -1,4 +1,5 @@
using Logging; using Logging;
using Newtonsoft.Json;
namespace Tranga.TrangaTasks; namespace Tranga.TrangaTasks;
@ -32,10 +33,12 @@ public class DownloadNewChaptersTask : TrangaTask
foreach (Chapter newChapter in newChapters) foreach (Chapter newChapter in newChapters)
{ {
DownloadChapterTask newTask = new (Task.DownloadChapter, this.connectorName, pub, newChapter, this.language, this); DownloadChapterTask newTask = new (Task.DownloadChapter, this.connectorName, pub, newChapter, this.language, this);
this.childTasks.Add(newTask);
newTask.state = ExecutionState.Enqueued;
taskManager.AddTask(newTask); taskManager.AddTask(newTask);
this.childTasks.Add(newTask);
} }
if(newChapters.Count > 0)
foreach(NotificationManager nm in taskManager.settings.notificationManagers)
nm.SendNotification(pub.sortName, $"Downloading {newChapters.Count} new Chapters.");
} }
public override string ToString() public override string ToString()