3

Visual C# 2005 (ネット フレームワーク 2) を使用して GUI アプリケーションを作成しています。次のコードを使用してプロセスを開始します。

Process process = new Process();
process.StartInfo = new ProcessStartInfo("app.exe");
process.StartInfo.WorkingDirectory = "";
process.StartInfo.Arguments = "some arguments";
process.Start();
process.WaitForExit();

このプロセスが完了するまでアプリケーションを待機させたいので、WaitForExit を使用しました。しかし、app.exe の実行中に GUI Windows がフリーズします。応答したい (たとえば、キャンセル ボタンを押す) が、その後に開始する別のプロセスがあるため、コードを続行したくありません。前もって感謝します!

4

6 に答える 6

5

Process クラスのExitedイベントをキャプチャできます。

void someMethod()
{
    //...possibly more code here
    Process process = new Process();
    process.StartInfo = new ProcessStartInfo("app.exe");
    process.StartInfo.WorkingDirectory = "";
    process.StartInfo.Arguments = "some arguments";
    process.Exited += new EventHandler(ProcessExited);
    process.Start();
}

void ProcessExited(object sender, System.EventArgs e)
{
  //Handle process exit here
}
于 2009-11-13T09:21:31.670 に答える
4

すべての GUI イベントの処理も担当するアプリケーションの唯一のスレッドでのプロセスの待機。何らかのイベント (他のプロセスが終了するなど) を待ちたいが、コードにそのイベントを通知したい場合は、別のスレッドで待機するか、イベント ハンドラーを使用する必要があります。

于 2009-11-13T09:25:55.390 に答える
3

これは役立つはずです。基本的に、Windowsフォームやこのような単純なタスクの場合、BackgroundWorkerが便利です。以下は、メモ帳を起動して閉じるのを待つか、ユーザーが[キャンセル]をクリックしてメモ帳を強制終了できるようにするための簡単なコードです。

    public Form1()
    {
        InitializeComponent();
        backgroundWorker1.WorkerSupportsCancellation = true;
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Process process = new Process();
        process.StartInfo = new ProcessStartInfo("notepad.exe");
        process.Start();
        while (!process.HasExited)
        {
            if (backgroundWorker1.CancellationPending)
            {
                process.Kill();
                continue;
            }
            else
                Thread.Sleep(1000);
        }
    }

    private void Start_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void Cancel_Click(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
    }
于 2009-11-13T09:38:56.477 に答える
2

Exited イベントでコールバックを受け取るには、EnableRaisingEvents を true に設定する必要があります。

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 

exited の使用は私にとってはうまく機能し、UI をロックすることなく、順次、部分的に同時に、または一度にすべてを実行するための優れた柔軟性を与えてくれました。

于 2013-05-24T17:23:23.873 に答える
1

おそらく、 BackgroundWorkerを使用してソリューションを実装する必要があります。実装が簡単で、必要なことを実行できます。

フォームに BackgroundWorker のインスタンスを追加し、BackgrondWorker の RunWorkerAsync メソッドから App.exe を実行しているプロセスを呼び出す必要があります。次に、CancelationPending プロパティを監視してプロセスを停止するか、RunWorkerCompleted イベントを監視して、プロセスが終了した後に必要なことを実行できます。

BackgroundWorker のキャンセルに関して、別のSO の質問があります。

于 2009-11-13T09:22:27.103 に答える
0

これに対する解決策は、次を追加してマルチスレッド開始を使用することです。

System.Threading の使用;

次に、次のコードを見てください。

    Process process = new Process();
    process.StartInfo = new ProcessStartInfo("app.exe");
    process.StartInfo.WorkingDirectory = "";
    process.StartInfo.Arguments = "some arguments";

//プロセスを開始する新しいスレッドを開始するため、WaitForExit を呼び出してもメイン スレッドがフリーズしません

    Thread th= new Thread(() =>
    {
        process.Start();
        process.WaitForExit();
    });
    th.Start();

複数のプロセスを連続して実行したい場合は、プロセスのリストのようなものを使用する必要がある別のケースです。次のコードを参照してください。

    List<Process> processes = new List<Process>();;

    Process process = new Process();
    process.StartInfo = new ProcessStartInfo("app.exe");
    process.StartInfo.WorkingDirectory = "";
    process.StartInfo.Arguments = "some arguments";

    processes.Add(process); 

// 別のものを手動で追加しますが、たとえばループを使用できます

    Process process2 = new Process();
    process.StartInfo = new ProcessStartInfo("app.exe");
    process.StartInfo.WorkingDirectory = "";
    process.StartInfo.Arguments = "some arguments";

    processes.Add(process2);

// 次に、スレッドを介してそれらを開始し、2 番目のプロセスは、UI をブロックすることなく最初のプロセスが終了するまで待機します

    Thread th= new Thread(() =>
    {
            for (int i = 0; i < processes.Count; i++)
            {
                    processes[i].Start();
                    processes[i].WaitForExit();
             }
    });
    th.Start();
于 2013-07-05T17:07:07.003 に答える