I have never worked with TPL before so I was wondering whether this can be done with it: My application creates a gif image animation file from a lot of frames. I start with a list of Bitmap which represents the frames of the gif file and need to do the following for each frame:
Obviously this process can be done in parallel for all the frames in the list but for each frame the order of steps needs to be the same. After that, I need to write all the frames to the gif file. Therefore all the frames need to be received in the same order they were in in the original list. On top of that, this process can start when the first frame is ready for it, there is no need to wait until all frames are processed.
So that's the situation. Is TPL Dataflow suitable for this? If yes, can anyone give me a hint in the right direction on how to design the tpl block structure to reflect the process explained above? It seems quite complex to me compared to some samples I've found.
I think it makes sense to use TPL Dataflow for this, especially since it automatically keeps the processed elements in the right order, even with parallelism turned on.
You could create a separate block for each step in the process, but I think there is no need for that here, one block for processing the frames and one for writing them will be enough:
public Task CreateAnimationFileAsync(IEnumerable<Bitmap> frames)
{
var frameProcessor = new TransformBlock<Bitmap, Bitmap>(
frame => ProcessFrame(frame),
new ExecutionDataflowBlockOptions
{ MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded });
var animationWriter = new ActionBlock<Bitmap>(frame => WriteFrame(frame));
frameProcessor.LinkTo(
animationWriter,
new DataflowLinkOptions { PropagateCompletion = true });
foreach (var frame in frames)
{
frameProcessor.Post(frame);
}
frameProcessor.Complete();
return animationWriter.Completion;
}
private Bitmap ProcessFrame(Bitmap frame)
{
…
}
private async Task WriteFrame(Bitmap frame)
{
…
}