/// <summary>Processes source files in parallel using .NET Tasks. The method returns immediately.</summary> public Task <RVList <LNode> >[] ProcessAsync(IReadOnlyList <InputOutput> sourceFiles, Action <InputOutput> onProcessed = null) { int parentThreadId = Thread.CurrentThread.ManagedThreadId; Task <RVList <LNode> >[] tasks = new Task <RVList <LNode> > [sourceFiles.Count]; for (int i = 0; i < tasks.Length; i++) { var io = sourceFiles[i]; tasks[i] = System.Threading.Tasks.Task.Factory.StartNew <RVList <LNode> >(() => { using (ThreadEx.PropagateVariables(parentThreadId)) return(new MacroProcessorTask(this).ProcessFileWithThreadAbort(io, onProcessed, AbortTimeout)); }); } return(tasks); }