多线程运行GhostScript.net时出现错误

时间:2019-07-15 14:46:18

标签: ghostscript ghostscript.net

我运行两个therad,每个线程处理为pdf,每个线程 线程有它自己的GhostscriptProcessor,如果我只是启动一个线程 没问题,但是如果我启动线程,gohstScript.net会给 错误“调用'gsapi_new_instance'时发生错误:-100”,并且 我尝试使用gs64bit版本和gs32bit版本,结果是相同的

我的研究员代码 谁能帮我?非常感谢。

 Thread t1 = new Thread(processPdf);
 Thread t2 = new Thread(processPdf);

 t1.Start("D:\\T1.PDF");

 t2.Start("D:\\T2.PDF");


  public static void processPdf(object obj) {

        GhostscriptVersionInfo gvi = null;
        GhostscriptProcessor   ghostscript = null;
        try
        {

  gvi = 
  GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | 
  GhostscriptLicense.AFPL, GhostscriptLicense.GPL);
            ghostscript = new GhostscriptProcessor(gvi);

            string outputPath = obj.ToString();
            string input = null;

            if (outputPath.Contains("T1")) {
                input = @"D:\TestFiles\111.pdf";
            }
            else {
                input = @"D:\TestFiles\222.pdf";
            }
            string[] args = GetArgs(input, outputPath);              

            ghostscript.Process(args);

        }
        catch (Exception ex) {

            Console.WriteLine(ex.StackTrace+"|"+ex.Message);

        }

    }//多线程

 private static string[] GetArg(string inputFile, string outputFile)
  {
         return new[] {
         $"gs",
         $"-o",
         $"{outputFile}",
         $"-dNoOutputFonts",   
         $"-sDEVICE=pdfwrite",
         $"{inputFile}",
        };
  }

1 个答案:

答案 0 :(得分:0)

您必须以特定方式构建Ghostscript DLL,以使其具有线程安全性,而这不是标准DLL的构建方式。

如果您尝试将非线程安全DLL与两个线程一起使用,则它确实会拒绝启动第二个实例,adnd将返回gs_error_Fatal(-100)。

您可以执行此操作,但是您需要重建DLL,需要定义编译器标志GS_THREADSAFE。被告知;如果这样做,某些设备将停止工作,则它们本质上不是线程安全的。这些是Artifex不拥有版权的“贡献”设备,因此无法修改。