より多くの新しいプロセスを生み出すときに、Process.Startが遅くなります
-
29-09-2019 - |
質問
経由で起動したプロセス Process.Start
生成されたプロセス(「子」)がより新しいプロセス(「孫」)を起動すると、約26秒の遅延があるようです。この問題を解決する方法を見つけようとしています。具体的には、これは元のプロセス(「親」)がASP.NET WebサイトまたはWindowsサービス(両方を試した)である場合に発生します。
サーバー側のコマンドラインツールを実行して、情報を収集し、ファイルシステムを変更し、「子」が終了したときに他のプロセスを続行しようとしています。コマンドラインを介して「子」を直接作成する場合、遅延はありません。特定のコマンドラインパラメーターでは、「子」が新しいプロセスを生み出さず、遅延はありません。ただし、他のパラメーターでは、「子」が「孫と同じ孫」(それ自体と同じ実行可能ですが、コードを変更することはできません)が発生し、最初のプロセスが25〜30秒(通常26秒)遅延があるようです。開始してから正常に実行されます。
変更を試みました UseShellExecute
プロパティ、 CreateNoWindow
財産、および WindowStyle
財産、効果がない。 ErrorDialog
そしてその RedirectStandard*
プロパティは偽です。
私が使用しているコードは次のとおりです。
using (Process p = new Process())
{
p.StartInfo = new ProcessStartInfo(exePath, args)
{
WorkingDirectory = workingDirectory,
UseShellExecute = true,
CreateNoWindow = true,
};
p.Start();
p.WaitForExit();
}
ああ、他の場所で参照されている問題(ただし解決策はありません)を見たので、それは重要ではないと思いますが、MsySgitのgit.exeにポイントを使用しているExepath。
解決
これが起こるかもしれない理由を伝えるのは難しいので、さらにトラブルシューティングを行う必要があります。
プロセスエクスプローラーとプロセスモニターを使用して、潜在的な問題を探すことをお勧めします。
問題はあなたのコードに直接ではなく、ユーザーの環境にもっと関連していると思います。たとえば、W3WP.EXEプロセスは非GUIセッション(セッション0)で実行され、ユーザーはWebアクセス(プロキシ構成)を設定されていないため、ここでタイムアウトの問題が表示される可能性があります。
他のヒント
WindowsサービスからProcess.startを使用してgit.cmdを呼び出した.batファイルを実行するのとまったく同じ問題がありました。 .batファイルがコマンドラインから直接実行された場合、gitコマンドはすぐに実行されますが、Windowsサービスから呼び出されたときはちょうど50秒遅れます。
許可の問題になりました。 Windowsサービスをユーザー(私の場合は管理者)として実行するように構成した後、GITプロセスはすぐに実行されました。おそらくサービスインストーラーを変更して「ユーザー」としてサービスを実行することができますが、同じ効果にインストールされた後にサービスプロパティを変更することができます。
「ローカルサービス」を有効にして遅延を回避する方法があるかもしれませんが、方法はわかりません。