/// <summary> /// GENERATE IMAGE TASKS /// Given a list of raw camera images, generate a list of associated published images. /// </summary> /// <param name="gatherResult"></param> /// <param name="token"></param> /// <returns></returns> public List <Task> GenerateImageTasks(GatherResult gatherResult, CancellationToken token) { var processor = new ImageProcessor(); var pubImages = DbRepo.ListPubImages(gatherResult); var items = new List <Task>(); foreach (var pubImage in pubImages) { items.Add(Task <GenerateImageResult> .Factory.StartNew(() => processor.GeneratePubImage(pubImage), token, TaskCreationOptions.LongRunning, TaskScheduler.Default) .ContinueWith(taskInfo => { try { token.ThrowIfCancellationRequested(); var pubImageResult = (GenerateImageResult)taskInfo.Result; Logit.LogGenerateImageResult(pubImageResult); var publishTasks = GeneratePublishTasks(pubImageResult, token); Parallel.ForEach(publishTasks, publishResult => { }); Task.WaitAll(publishTasks.ToArray()); } catch (Exception exc) { Logit.LogError(exc); } }) ); } return(items); }
public static void RunTopLevelTasks(int currentMinute, CancellationToken token) { List<EntityServer> servers = null; try { token.ThrowIfCancellationRequested(); servers = DbRepo.ListServersByMinute(currentMinute); Logit.LogInformation("Processing " + servers.Count.ToString() + " servers..."); } catch (Exception exc) { var errMsg = "Dispatcher Error: " + exc.Message; if (exc.InnerException != null) { errMsg += "-- " + exc.InnerException.Message; } Logit.LogError(new ApplicationException(errMsg)); } try { token.ThrowIfCancellationRequested(); var processor = new TaskProcessor(); var topLevelTasks = processor.GenerateTopLevelTasks(servers, token); Parallel.ForEach(topLevelTasks, topLevelResult => { }); Task.WaitAll(topLevelTasks.ToArray()); //needed to catch aggregate exceptions } catch (Exception exc) { Logit.LogError(exc); } }
/// <summary> /// GENERATE TOP LEVEL TASKS /// Combination of direct copy camera tasks, http camera tasks, and ftp server tasks. /// </summary> /// <param name="servers"></param> /// <param name="token"></param> /// <returns></returns> public List <Task> GenerateTopLevelTasks(List <EntityServer> servers, CancellationToken token) { var processor = new GatherProcessor(); var items = new List <Task>(); foreach (var server in servers) { if (server.ServerType == "FTP") { items.Add(Task <List <GatherResult> > .Factory.StartNew(() => processor.PerformFtpGather(server), token, TaskCreationOptions.None, TaskScheduler.Default) .ContinueWith(taskInfo => { try { token.ThrowIfCancellationRequested(); var gatherResults = (List <GatherResult>)taskInfo.Result; Logit.LogGatherResults(gatherResults); List <Task> imageTasks = new List <Task>(); foreach (var gatherResult in gatherResults) { imageTasks.AddRange(GenerateImageTasks(gatherResult, token)); } Parallel.ForEach(imageTasks, imageResult => { }); Task.WaitAll(imageTasks.ToArray()); } catch (Exception exc) { Logit.LogError(exc); } }) ); } else { foreach (var camera in server.Cameras) { items.Add(Task <GatherResult> .Factory.StartNew(() => processor.PerformGather(camera), token, TaskCreationOptions.LongRunning, TaskScheduler.Default) .ContinueWith(taskInfo => { try { token.ThrowIfCancellationRequested(); var gatherResult = (GatherResult)taskInfo.Result; Logit.LogGatherResult(gatherResult); var imageTasks = GenerateImageTasks(gatherResult, token); Parallel.ForEach(imageTasks, imageResult => { }); Task.WaitAll(imageTasks.ToArray()); } catch (Exception exc) { Logit.LogError(exc); } }) ); } } } return(items); }