2017-02-14 3 views
0

У меня есть функция, которая использует GhostScript.NET для печати документов PDF. Все работает правильно, если один пользователь пытается распечатать, однако, когда несколько пользователей пытаются одновременно печатать, он не печатает все документы. Я понимаю, что для создания многократной одновременной печати я создам несколько экземпляров ghostscript. Я наткнулся на этот вопрос:Попытка печати с использованием нескольких экземпляров GhostScript с параллельным циклом.

Ghostscript.NET Multithreading Issue

Один из пользователей говорит, чтобы создать параллельную forloop, но я честно не знаю, как построить один, так что он создает необходимое количество экземпляров GhostScript.

У меня есть основная функция:

public static void PrintFormPdfData(byte[] formPdfData, string printer) 
    { 
     var filename = @"C:\TEMP\report.pdf"; 
     using (var file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      file.Write(formPdfData, 0, formPdfData.Length); 
      using (GhostscriptProcessor processor = new GhostscriptProcessor()) 
      { 
       List<string> switches = new List<string>(); 
       switches.Add("-empty"); 
       switches.Add("-dPrinted=false"); 
       switches.Add("-dBATCH"); 
       switches.Add("-dPDFFitPage"); 
       switches.Add("-dNOPAUSE"); 
       switches.Add("-dNOSAFER"); 
       switches.Add("-dNumRenderingThreads=3"); 
       switches.Add("-dNumCopies=1"); 
       switches.Add("-sDEVICE=mswinpr2"); 
       switches.Add("-sOutputFile=%printer%" + printer); 
       switches.Add(filename); 
       try 
       { 
        processor.StartProcessing(switches.ToArray(), null); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
       finally 
       { 
        File.Delete(filename); 
       } 
      } 
     } 
    } 

Любая помощь будет принята с благодарностью.

+0

Проблема с кодом является, вы используете тот же путь к файлу для всех вызывающих абонентов – VMAtm

+0

Да, я исправил это ниже. – Crumblenautjs

ответ

0

Я понял, как использовать Parallel ForEach ... Вот мой обновленный код для тех, кто заинтересован в также запуск нескольких экземпляров Ghostscript:

public static void PrintingQueue(Queue<byte[]> printQueue, string printer, int copies) 
    { 
     Parallel.ForEach(printQueue, (currentFile) => 
     { 
      currentFile = printQueue.Dequeue(); 
      PrintFormPdfData(currentFile, printer, copies); 
     }); 
    } 

    private static void PrintFormPdfData(byte[] pdfFormBytes, string printer, int copies) 
    { 
     var fileName = Path.GetTempFileName(); 
     using (var file = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      file.Write(pdfFormBytes, 0, pdfFormBytes.Length); 
      using (GhostscriptProcessor processor = new GhostscriptProcessor()) 
      { 
       List<string> switches = new List<string>(); 
       switches.Add("-empty"); 
       switches.Add("-dPrinted"); 
       switches.Add("-dBATCH"); 
       switches.Add("-dPDFFitPage"); 
       switches.Add("-dNOPAUSE"); 
       switches.Add("-dNOSAFER"); 
       switches.Add("-dNumRenderingThreads=3"); 
       switches.Add("-dNumCopies=1"); 
       switches.Add("-sOutputFile=%printer%" + printer); 
       switches.Add("-sDEVICE=mswinpr2"); 
       switches.Add(fileName); 
       try 
       { 
        processor.StartProcessing(switches.ToArray(), null); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
       file.Close(); 
      } 
      File.Delete(fileName); 
     } 
    } 
Смежные вопросы