1

コードを実行するとフォームがフリーズする理由を理解しようとしています。また、フォームを最小化または移動することもできません。WaitForExitプロセスで使用されているためですか?

以下のコードは、ボタンのクリックに関連付けられています。

If Checkbox1.checked = True Then
   Call Test()
End If

If Checkbox2.checked = True Then
   Goto NextStep
Else
   Goto StopProcessing
End If

これが私が呼んでいるテストサブです。オプションの引数を指定してexeを呼び出します。

        Using psinfo As New Process
            psinfo.StartInfo.FileName = "C:\Temp\Test.exe "
            psinfo.StartInfo.Arguments = Arg1
            psinfo.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            psinfo.Start()
            psinfo.WaitForExit()
        End Using

WaitForExitプロセスが完了するまで次のステートメント(次のステートメントはCheckbox2のIfステートメント)を処理しないように(私が思ったように)追加されました。そうではありませんか?

4

1 に答える 1

2

WaitForExitが追加され(私が思ったように)、プロセスが完了するまで次のステートメント(次のステートメントはCheckbox2のIfステートメント)を処理しません。

を呼び出すと、プロセス( )が完了WaitForExitするまでブロックされます。Test.exe

これはユーザーインターフェイススレッドで実行しているため、プロセスが完全に完了するまでフォームが「フリーズ」します。

これが発生しないようにする必要がある場合は、バックグラウンドスレッドで待機する必要があります。潜在的に、このコードをに移動し、BackgroundWorkerそれを使用してメインウィンドウと同期することもできますが、プロセスが終了するまでの「待機」を別の方法で処理する必要があります(つまり、UIを事前に無効にし、プロセスを実行します)。 、完了したら再度有効にします)。

Processクラスを使用する場合、別の方法として、プロセスを追加してから、 Process.ExitedEnableRaisingEventsにハンドラーを追加することもできます。これにより、ではなく、プロセスが完了したときにイベントを介して通知を受け取ることができます。WaitForExit()

于 2012-10-16T17:48:24.163 に答える