Ghostscript.NET 多线程问题

Posted

技术标签:

【中文标题】Ghostscript.NET 多线程问题【英文标题】:Ghostscript.NET Multithreading Issue 【发布时间】:2014-11-13 19:58:58 【问题描述】:

我们每月运行的流程中最长的部分是自动切片并将某些 PDF 转换为图像。每个 PDF 被读入,转换为 3 个不同的 PDF,然后将这 3 个转换为图像以放置在电子邮件中给客户。每个客户的 PDF 文件都是唯一的,我们每月向至少 15,000 名(通常​​更接近 22,000)名客户发送一份 PDF 文件。

我们的 PDF 生成和切片已经是多线程的,但我一直在研究并行化它的其余部分。

为此,我已将我们的流程转换为使用 Ghostscript.NET,它声称是一个支持并行化 Ghostscript 的库。

为此,我将这段代码封装在一个 Parallel.Foreach() 循环中,循环中的每次迭代都在不同的初始 PDF 上工作:

      GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);

      GhostscriptProcessor processor = null; 

        try
        
            //sArgs is an array of arguments for ghostscript
            processor = new GhostscriptProcessor(gsVersionInfo, true);
            processor.StartProcessing(sArgs, new ConsoleStdIO(true,false,true));
            while (processor.IsRunning)
            
                Thread.Sleep(100);
            
        

当我运行上述代码并强制 Parallel.Foreach 仅使用 1 个线程(禁用并行化)时,它会像以前一样运行并正确生成所有文件。如果我使用 5 度并行化,它会开始抛出错误。这些错误各不相同,但往往表明输入的 PDF 文件格式不正确,这让我认为 ghostscript 处理器实际上并不是线程安全的,并且会踩踏彼此的输入。

如何正确使用 Ghostscript.NET 在不同文件上同时运行多个 Ghostscript 实例?

【问题讨论】:

ghostscriptnet.codeplex.com/discussions/569876 @Aybe:我们使用的是最新版本的 GhostScript。不幸的是,我已经看到了这个(相当令人失望的)问题:( 您可能应该在 CodePlex 或 GitHub 存储库中提问。 我不是 .NET 开发人员,所以恐怕上面的代码对我来说毫无意义,但是我可以说虽然 Ghostscript 能够进行多线程 渲染,它不能执行多线程解释。如果要一次处理多个输入文件,则需要多个进程来执行此操作,不能使用同一个 Ghostscript 实例来处理多个输入文件。 为什么需要 while (processor.IsRunning),StartProcessing 不会阻塞进程? 【参考方案1】:

我正在使用具有多线程的 Ghostscript.NET。 您在上面共享的代码应该在 Parallel.For 循环内。是的,这意味着从

开始的整个代码
GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);

直到最后,它应该可以工作。正如上面@KenS 提到的,每个多线程进程应该使用不同的GhostscriptProcessor 实例。

【讨论】:

以上是关于Ghostscript.NET 多线程问题的主要内容,如果未能解决你的问题,请参考以下文章

如何获得有效的 x64 THREADSAFE Ghostscript DLL

Ghostscript.NET 图片文字质量问题

Ghostscript.NET 忽略后记

如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A

Ghostscript.net 打印 pdf 页面方向

在 ASP.NET Azure 网站上使用 Ghostscript.Net