gpt4 book ai didi

multithreading - (Leadtools)Rastercodecs.load是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-03 12:55:47 27 4
gpt4 key购买 nike

我想将PDF转换为图像。我正在使用Leadtools,并且为了提高速度,我以以下方式使用多线程。

string multiPagePDF = @"Manual.pdf";
string destFileName = @"output\Manual";
Task.Factory.StartNew(() =>
{
using (RasterCodecs codecs = new RasterCodecs())
{
CodecsImageInfo info = codecs.GetInformation(multiPagePDF, true);
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 5;
Parallel.For(1, multiPagePDF.TotalPages+1, po, i =>
{
RasterImage image = codecs.Load(multiPagePDF, i);
codecs.Save(image, destFileName + i + ".png", RasterImageFormat.Png, 0);
});
}
});

这是线程安全的方式吗?会导致意外的输出吗?
我尝试了几次,在某些情况下,特定页面在输出图像中出现了两次。

解决方案

根据Leadtools的在线聊天支持(顺便说一句,这非常有帮助),Rastercodecs.load不是线程安全的,上面的代码将导致意外的输出(在我的情况下,第1页在图像的输出集中出现两次)。解决方案是在Parallel.For中定义编解码器变量,以便每个迭代分别访问其自己的RasterCodecs。

最佳答案

Amyn,
如您所知,在这种情况下使用RasterCodecs对象的正确方法是:

Task.Factory.StartNew(() =>
{
using (RasterCodecs codecs = new RasterCodecs())
{
CodecsImageInfo info = codecs.GetInformation(multiPagePDF, true);
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 5;
Parallel.For(1, info.TotalPages + 1, po, i =>
{
using(RasterCodecs codecs2 = new RasterCodecs()) {
RasterImage image = codecs2.Load(multiPagePDF, i);
codecs2.Save(image, destFileName + i + ".png", RasterImageFormat.Png, 0);
}
});
}
});

在多核处理器上运行时,这会给您带来相同的速度优势,而不会引起并发线程之间的任何冲突。

LEADTOOLS RasterCodecs.Load()和RasterCodecs.Save()方法是线程安全的。之所以创建RasterCodecs类的多个实例,是因为该类在内部使用了结构,这些结构包含许多不同的文件加载和保存选项。在多个线程之间使用这些结构(更改了这些选项)会导致不可预测的结果。加载选项结构中的此类属性之一是页码。因此,建议使用此类的单独实例。

关于multithreading - (Leadtools)Rastercodecs.load是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25863646/

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