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 つのインスタンスで EXE を実行するためのチャンクが少なくとも 2 つある場合です。私の唯一の問題は、私が持っていること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

最後に、使用された方法は次のとおりです。

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 に答える
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

私が見つけたのは、アプリケーションの 2 つのインスタンスを開始するとき、またはアプリケーションのインスタンスを 1 つが既に実行されているときに開始するときに、WaitForExit および Exited イベントが機能しないことがあるということです。よくよく見てみると、同じアプリケーションの複数のインスタンスを作成しようとすると、Process オブジェクト全体がおかしくなる (そして役に立たなくなる) ことがわかります。Process オブジェクトに依存しない回避策を設計する必要がありました。

于 2012-11-15T15:28:37.923 に答える