如何排队系统进程启动

时间:2014-09-10 13:19:18

标签: c# pdf

我编写了以下代码来循环数据表行的负载并生成PDF(如果它尚不存在)。它可以工作,但它一次性启动wkhtmltoPDFs所以30个进程开始并杀死服务器,d哦!

一次启动一个流程的最佳方法是什么,而不是在上一个流程运行之前启动第二个流程?

   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

                }

            } 

1 个答案:

答案 0 :(得分:0)

Process.Start返回一个Process对象,它允许您监视新创建的进程的状态。

一种简单的阻止方法是让每个工作人员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;