private async Task kickOff(int taskID) { var profile = _profileStorage.Current; var taskInfo = $"task: {taskID}"; try { //2018-08-16 shb moved from init to enable task restartability after task cancellation. #if (DEBUG) if (_taskManager.CanStart("ReadConsole")) { var newTaskID = _taskManager.NewTaskID(); Task task = new Task(new Action(async() => await ReadConsole())); await _taskManager.Start(newTaskID, task, $"ReadConsole", isLongRunning : true); } #endif /* * 2018-07-05 shb responsive status reports as soon as task completes */ if (_taskManager.CanStart("TaskCompletion")) { var newTaskID = _taskManager.NewTaskID(); Task task = new Task(new Action(async() => await _taskManager.TaskCompletion(profile))); await _taskManager.Start(newTaskID, task, $"TaskCompletion", isLongRunning : true); } var cloudConnection = _connectionFinder.GetPrimaryLifeImageConnection(profile); var connectionManager = _connectionManagerFactory.GetManager(cloudConnection) as ILifeImageCloudConnectionManager; if (cloudConnection.loginNeeded) { await connectionManager.login(taskID); //await profile.GetPrimaryLifeImageConnection().login(taskID); } if (!cloudConnection.loginNeeded) { kickOffCount++; profile.lastKickOff = DateTime.Now; _logger.Log(LogLevel.Debug, $"{taskInfo} kickOffCount: {kickOffCount}"); _logger.Log(LogLevel.Debug, $"{taskInfo} -----------------KickOff----------------"); _logger.Log(LogLevel.Debug, $"{taskInfo} Processing UpgradeDowngrade"); UpgradeDowngrade(); _logger.Log(LogLevel.Debug, $"{taskInfo} Processing Run"); Run(); /* * 2018-07-06 shb purge async */ if ((kickOffCount + 9) % 10 == 0) { if (_taskManager.CanStart("Purge")) { var newTaskID = _taskManager.NewTaskID(); Task task = new Task(new Action(async() => await _litePurgeService.Purge(newTaskID))); await _taskManager.Start(newTaskID, task, $"Purge", isLongRunning : false); } } // Process the queues in the connections foreach (var conn in profile.connections) { _logger.Log(LogLevel.Debug, $"{taskInfo} connection: {conn.name} enabled: {conn.enabled}"); if (conn.enabled == false) { _logger.Log(LogLevel.Debug, $"{taskInfo} connection: {conn.name} enabled: {conn.enabled} skipping"); continue; } /* * 2018-05-10 shb prevent re-entrancy problems with Kickoff. */ if (_taskManager.CanStart($"{conn.name}.Kickoff") && conn.started) { var connManager = _connectionManagerFactory.GetManager(conn); var newTaskID = _taskManager.NewTaskID(); Task task = new Task(new Action(async() => await connManager.Kickoff(newTaskID)), _taskManager.cts.Token); await _taskManager.Start(newTaskID, task, $"{conn.name}.Kickoff", isLongRunning : false); } } /* * 2018-06-12 shb status is now long running. */ if (_taskManager.CanStart($"UpdateStatus")) { var newTaskID = _taskManager.NewTaskID(); Task task = new Task(new Action(async() => await _taskManager.UpdateStatus())); await _taskManager.Start(newTaskID, task, $"UpdateStatus", isLongRunning : true); } } else { _logger.Log(LogLevel.Information, "Primary LifeImage account loginNeeded, skipping kickOff until resolved"); await connectionManager.login(taskID); //await profile.GetPrimaryLifeImageConnection().login(taskID); } } catch (TaskCanceledException) { _logger.Log(LogLevel.Information, $"Task was canceled."); } catch (Exception e) { _logger.LogFullException(e, taskInfo); //throw e; throw; } }