两次运行相同的exe

时间:2012-11-15 14:49:25

标签: c#

我有以下代码:

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返回的参数。 如何解决这个问题?

5 个答案:

答案 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;
                                    }
                                );