Ghostscript.NET多线程问题

时间:2014-11-13 19:58:59

标签: c# ghostscript pdf-conversion ghostscript.net

我们运行的每月流程中最长的部分是自动切片并将一些PDF转换为图像。每个PDF都被读入,转换为3个不同的PDF,这3个转换为图像,以便通过电子邮件发送给客户。 PDF是每个客户独一无二的,我们每月向至少15,000(通常更像是22k)的客户发送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实例?

1 个答案:

答案 0 :(得分:2)

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

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

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