public static void RunInWorkItems <In>(List <In> input, RunWorkItemDel <In> action, WorkItemRunnerSettings settings) { List <Task> taskList = new List <Task>(); int workSize = settings.GetOptimalWorkSize(input.Count); int currentID = 0; int taskNr = 0; Logger.Log(LogType.Log, $"Starting Tasks...", 2); while (currentID != input.Count) { int len = Math.Min(workSize, input.Count - currentID); int id = currentID; int nr = taskNr; Task task = new Task(() => action(input, id, len)); task.ContinueWith(t => Logger.Log(LogType.Log, "Task: " + nr + " completed.", 2)); taskList.Add(task); if (settings.UseMultithread) { task.Start(); } else { task.RunSynchronously(); } currentID += len; taskNr++; } Logger.Log(LogType.Log, $"Waiting for Tasks..", 2); Task.WaitAll(taskList.ToArray()); }
public FLParser(FLInstructionSet instructionSet, BufferCreator bufferCreator, WorkItemRunnerSettings settings = null) : base(typeof(FLParserInput), typeof(SerializableFLProgram)) { InstructionSet = instructionSet; BufferCreator = bufferCreator; WorkItemRunnerSettings = settings ?? WorkItemRunnerSettings.Default; AddSubStage(new LoadSourceStage()); AddSubStage(new RemoveCommentStage(this)); AddSubStage(new StaticInspectionStage(this)); AddSubStage(new ParseTreeStage(this)); Verify(); }
public FLScriptRunner( CLAPI instance, KernelDatabase dataBase, BufferCreator creator, FLInstructionSet instructionSet, FLProgramCheckBuilder checkBuilder, WorkItemRunnerSettings runnerSettings) { Db = dataBase; InstructionSet = instructionSet; BufferCreator = creator; Parser = new FLParser(InstructionSet, BufferCreator, runnerSettings); ProgramChecks = checkBuilder; checkBuilder.Attach(Parser, true); Instance = instance; ProcessQueue = new Queue <FlScriptExecutionContext>(); }
public static List <Out> RunInWorkItems <In, Out>(List <In> input, RunWorkItemDel <In, Out> action, WorkItemRunnerSettings settings) { List <Task <List <Out> > > taskList = new List <Task <List <Out> > >(); int workSize = settings.GetOptimalWorkSize(input.Count); int currentID = 0; int taskNr = 0; int maxTasks = input.Count / workSize; Logger.Log(LogType.Log, $"Starting {maxTasks} Tasks...", 2); while (currentID != input.Count) { int len = Math.Min(workSize, input.Count - currentID); int id = currentID; int nr = taskNr; Task <List <Out> > task = new Task <List <Out> >(() => action(input, id, len)); task.ContinueWith(t => Logger.Log(LogType.Log, "Task " + nr + " of " + maxTasks + " completed.", 2)); taskList.Add(task); if (settings.UseMultithread) { task.Start(); } else { task.RunSynchronously(); } currentID += len; taskNr++; } Logger.Log(LogType.Log, $"Waiting for Tasks..", 2); Task.WaitAll(taskList.ToArray()); List <Out> ret = new List <Out>(input.Count); int nextIndex = 0; for (int i = 0; i < taskList.Count; i++) { ret.AddRange(taskList[i].Result); } return(ret); }