7

インストーラーを起動し、インストーラーが戻るのを待ってから他の作業を続行するc#コードを書いています。

インストールが実際に完了する前に元のプロセスが戻って他のプロセスを生成する特定のインストーラーに問題があります。すべてのプロセスが終了するまで待つことができる方法はありますか?

これが私が問題を抱えているシナリオを明確にするために:

  1. Installer1を起動します
  2. Installer1は別のインストーラーを生成/起動します(Installer2)
  3. インストーラー1が返されます
  4. アプリケーションはインストールが終了したと見なしますが、Installer2はまだ実行中です。これにより、アプリのワークフローに問題が発生します。

現在使用しているコードは次のとおりです。

// launch installer
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath);

// wait for process to return
do
{
    if (!process.HasExited)
    {
    }
}
while (!process.WaitForExit(1000));

if (process.ExitCode == 0)
{
    _fileService.MoveFile(_localFilePath, _postInstallFilePath);

    _notification.SetComplete(false);

    return true;
}
return false;
4

2 に答える 2

6

この問題を解決するためにWMIを使用することを考えましたか?

WMIを使用して、プロセスの作成および削除イベントをリッスンできます。質問967668には良い例があります。

プロセス作成イベントを受け取ったら、WMIクエリを発行して、プロセスがルートインストーラーの子(または子の子など)であるかどうかを次のように判断できます。

"SELECT * FROM Win32_Process WHEREParentProcessId="。

于 2010-02-10T12:57:54.063 に答える
0

do/whileループ内でこのように行う方がよい場合があります。

System.Diagnostics.Process [] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName、Environment.MachineName);

次に、を繰り返してprocs、プロパティを使用して、まだ実行されているものを見つけHasExitedます...

プロセスのサブプロセスはコードによって所有されているというロジックであるため、最初にそれらが終了したかどうかを確認できます。終了していない場合は、ループを続けます...

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-09T01:50:46.210 に答える