1

我有以下代码:

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

4

5 回答 5

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
}
于 2012-11-15T14:54:30.593 回答
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;
}
于 2012-11-15T15:16:06.400 回答
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;
    }
}
于 2012-11-15T14:55:39.323 回答
0

我发现至少有时当您启动一个应用程序的两个实例,或者启动一个应用程序的实例时,一个已经在运行的应用程序,WaitForExit 和 Exited 事件不起作用。如果您仔细观察,您会发现当您尝试拥有同一个应用程序的多个实例时,整个 Process 对象会变得混乱(变得无用)。我必须设计一个不依赖 Process 对象的解决方法。

于 2012-11-15T15:28:37.923 回答
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;
                                    }
                                );
于 2014-03-26T09:48:29.877 回答