public async Task<List<WriteableBitmap>> Animate(int renderWidth, int renderHeight, TimeSpan length, ProgressToken token, ParameterBinding start, ParameterBinding end) { const int parallelism = 1; // TODO change _lastRot variables so animations can be rendered in parallel var totalFrames = (int)length.TotalSeconds*AnimationFps; var frames = new List<WriteableBitmap>(); for (var frame = 0; frame < totalFrames; frame += parallelism) { var frameBindings = Enumerable.Range(frame, parallelism).Select(i => start.Interpolate(end, i, totalFrames)); var renderTasks = frameBindings.Select(b => RenderAsync(renderWidth, renderHeight, b, null)); var rendered = await Task.WhenAll(renderTasks); frames.AddRange(rendered); if (token != null) { token.Value = (int)((float)frame / totalFrames * 100); } } return frames; }