2014-09-10 3 views
0

Я написал следующий код, чтобы обойти загрузку строк таблицы данных и создать PDF-файл, если он еще не существует. Он работает, но он запускает wkhtmltoPDF все за один раз, поэтому 30 процессов начинают работу и убивают сервер, ну!Как запустить системный процесс

Каков наилучший способ запуска одного процесса за раз, а не запуска второго, пока предыдущий не запустится?

DB db = new DB(); 
      DataTable dtPosters = db.GetDataTable("select * from Invoices where PDFGenerated <> 1 or PDFGenerated is Null"); 

      foreach (DataRow DR in dtPosters.Rows) 
      { 
       //Generate Poster, If exsists (Don't!) 
       Directory.CreateDirectory(string.Format("D:\\Invoices\\")); 
       string FilePath = string.Format("D:\\Invoices\\{0}.pdf", DR["InvoiceNumber"].ToString()); 
       if (!File.Exists(FilePath)) 
       { 
        string CMD = string.Format("C:\\Services\\Automafe\\wkhtmltoPDF.exe http://invoicegen/viewinvoice.aspx?InvoiceNumber={0} {1}", DR["InvoiceNumber"].ToString(), FilePath); 
        System.Diagnostics.Process.Start("cmd", "/c " + CMD); 

       } 
       else 
       { 

        //Update the DB 

       } 

      } 
+0

Вы можете добавить слушателя событий, чтобы увидеть, когда процесс закрыт, так как здесь: http://stackoverflow.com/a/8455896/575530 – dumbledad

+0

Это одно еще лучше: 'process.WaitForExit()' HTTP : //stackoverflow.com/a/3147920/575530 – dumbledad

ответ

0

Process.Start возвращает объект процесса, который позволяет отслеживать состояние вновь созданного процесса.

Простой, перекрывая путь будет иметь каждый работник wait for the process to exit

var myProcess = System.Diagnostics.Process.Start("cmd", "/c " + CMD); 
myProcess.WaitForExit(); 

лучший способ будет использовать Exited event handler для мониторинга при выходе из процесса.

var myProcess = System.Diagnostics.Process.Start("cmd", "/c " + CMD); 
myProcess.Exited += myProcessFinishedHandler; 
Смежные вопросы