2012-11-15 75 views
0

我有以下代码:运行相同的EXE两次

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

查一查螺纹。这太大而无法放在单个答案中。 – Flater

+0

如果每个调用/迭代都依赖于以前的结果,则无法对其进行并行化......如果希望能够这样做,则需要更改流程或如何使用结果。 –

+0

@JeffMercado是什么让你认为这两个过程是相互依赖的? – Servy

回答

1

添加处理程序已退出处理的返回值,像这样

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 
} 
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; 
    } 
} 
+1

为了等待每个线程而启动两个线程相当昂贵;你只需要一个主线程来等待所有的进程。就像在等待任何进程之前启动所有进程一样简单。 – Servy

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; 
} 
0

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

+1

这只是错误的。它工作得很好。如果它不适合你,那么它要么是因为你错误地使用了它,要么是因为你正在运行的应用程序有问题而没有使用并行实例。 – Servy

+0

这是可能的。虽然我不希望Acrobat Reader在运行并行实例时遇到问题。我的错。 – Stonehead

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; 
            } 
           ); 
+0

这可能会起作用,但您不需要并行来启动两个进程。刚开始第一个和第二个过程,然后等待两个退出。所有这些都可以在单个线程上完成。 –

+0

你可能有权利,但是:1.我不知道我必须开始的进程数量和2.它们之间存在速度差异。速度是我需要在这里改进的。 –

相关问题