我有以下代码:
foreach(string fileName in chunkFiles)
{
p = GenerateProcessInstance();
p.StartInfo.Arguments = string.Format("{0} {1} false {2}", fileName, Id, logName);
p.Start();
p.WaitForExit();
sent += p.ExitCode;
}
我想要做的是,如果我有至少2个块来运行带有2个实例的EXE。我唯一的问题是我有WaitForExit
。我正在使用它,因为我需要从EXE返回的参数。
如何解决这个问题?
答案 0 :(得分:1)
为Exited添加处理程序以处理返回值,如此
foreach(string fileName in chunkFiles)
{
p = GenerateProcessInstance();
p.StartInfo.Arguments = string.Format("{0} {1} false {2}", fileName, Id, logName);
p.Exited += new EventHandler(p_Exited);
p.Start();
}
protected void p_Exited(object sender, EventArgs e)
{
var p = (Process)sender;
// Handle p.ExitCode
}
答案 1 :(得分:1)
只需在循环中启动所有进程,然后在另一个循环中等待所有进程:
var processes = new List<Process>();
int sent = 0;
foreach (string fileName in chunkFiles)
{
Process p = GenerateProcessInstance();
p.StartInfo.Arguments = string.Format("{0} {1} false {2}", fileName, Id, logName);
p.Start();
processes.Add(p);
}
foreach (Process p in processes)
{
p.WaitForExit();
sent += p.ExitCode;
}
答案 2 :(得分:0)
static void Main()
{
Thread t = new Thread(new ThreadStart(RunExe))
t.Start
Thread t2 = new Thread(new ThreadStart(RunExe))
t2.Start
}
public void RunExe()
{
foreach(string fileName in chunkFiles)
{
p = GenerateProcessInstance();
p.StartInfo.Arguments = string.Format("{0} {1} false {2}", fileName, Id, logName);
p.Start();
p.WaitForExit();
sent += p.ExitCode;
}
}
答案 3 :(得分:0)
我发现,至少有时当你启动一个应用程序的两个实例,或者当一个应用程序已经运行时启动一个应用程序的实例时,WaitForExit和Exited事件不起作用。如果仔细观察,当您尝试拥有同一应用程序的多个实例时,您将看到整个Process对象变得混乱(并变得无用)。我不得不设计一个不依赖于Process对象的解决方法。
答案 4 :(得分:0)
最后,使用的方法是:
Parallel.ForEach(
chunkFiles,
new ParallelOptions { MaxDegreeOfParallelism = 2 },
chunk =>
{
//create new paralel process - count limited to MaxDegreeOfParallelism
Process p = ProcessManager.GenerateProcessInstance();
p.StartInfo.Arguments = string.Format("{0} {1} {2} {3}", chunk, Id, logFileName, infoFileName);
p.Start();
p.WaitForExit();
sentEmails += p.ExitCode;
}
);