次のような単純なコードでアプリケーションを呼び出そうとしています
public void Run(string command)
{
Process proc = new Process();
proc.StartInfo.FileName = "acvTemp.exe";
proc.StartInfo.Arguments = command;
proc.Start();
proc.WaitForExit();
}
私が起動している fileName プロセスは、実際に新しいウィンドウを生成します。no exit にするいくつかのコマンドで起動されています。いえ
command = acvtest.exe /launch /wait /log:<temp.log>
したがって、acvtest.exe がマシン上で実行を開始し、実際にはまだ実行されているため、次のような他のコマンドを実行できます。
acvtest.exe /getid:<name>
これは、アプリケーションを手動で使用する方法です。
acvtest.exe /launch /wait /log:<temp.log>
acvtest.exe /getid:<name>
実際の /launch プロセスがシェル コマンド プロンプトに戻ることに注意してください。これは、/launch で新しいコマンド ウィンドウが開かれ、/getid の出力が実際にログに書き込まれるためです。
私の問題は、最初の /launch または /getid コマンドが実行されたときに、ログでハンドルが解放される前に、waitforexit() が終了しているように見えることです。(一部の子スレッドが終了する前にある可能性がありますか?)
つまり、次のコマンドは、スリープ状態にするか待機するまで失敗します。waitforexit() でも
Run("/launch /wait /log:<temp.log>");
Run("/getid:<name>");
Run("shutdown");
//Needs some sleep or wait here
using (StreamReader reader = new StreamReader("temp.log"))
{
Console.WriteLine(reader.ReadToEnd());
}
上記の 2 つのセクションの間にスリープまたは待機がない場合、ログへのアクセスは失敗し、別のプロセスによって既に使用されているというエラーが表示されます。アプリケーションが実際にプロセスを終了する前に終了しているように見えます。これはアプリケーションに問題がありますか? それを回避するために私にできることはありますか?
新しいシェルが起動されるため、ここで別の Run() コードが必要になる可能性があると思います。
[アップデート]
問題はログ ファイルだけではありません。約 100,000 個のファイル名で Run("/getid:") を実行すると、これらの多くが「リソースが利用できません」というエラーで失敗します。そのため、リソースを解放する前にアプリケーションが終了する可能性があると考えました探しています。