gpt4 book ai didi

c# - TPL 数据流 : design for parallelism while keeping order

转载 作者:太空狗 更新时间:2023-10-30 00:31:54 26 4
gpt4 key购买 nike

我以前从未与 TPL 合作过,所以我想知道是否可以用它来完成:我的应用程序从很多帧创建一个 gif 图像动画文件。我从代表 gif 文件帧的位图列表开始,需要为每个帧执行以下操作:

  1. 在框架上绘制一些文本/位图
  2. 裁剪框架
  3. 调整框架大小
  4. 将图像减少到 256 色

显然,这个过程可以对列表中的所有帧并行完成,但对于每个帧,步骤的顺序需要相同。之后,我需要将所有帧写入 gif 文件。因此,所有帧都需要按照它们在原始列表中的相同顺序接收。最重要的是,这个过程可以在第一帧准备就绪时开始,无需等到所有帧都处理完。

原来是这样。 TPL Dataflow 适用于此吗?如果是的话,谁能给我一个正确方向的提示,告诉我如何设计 tpl block 结构以反射(reflect)上述过程?与我发现的一些样本相比,它对我来说似乎相当复杂。

最佳答案

我认为为此使用 TPL 数据流是有意义的,尤其是因为它会自动以正确的顺序保持已处理的元素,即使启用了并行性也是如此。

您可以为过程中的每个步骤创建一个单独的 block ,但我认为这里没有必要,一个用于处理帧的 block 和一个用于写入它们的 block 就足够了:

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)
{

}

关于c# - TPL 数据流 : design for parallelism while keeping order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com