2012-03-07 15 views
0

バッチファイルを開くc#winformを使用しています。 私は、ユーザーがwinformの "停止"ボタンを押してこのタスクを終了できるようにします。 問題は、バッチファイルの実行が完全に完了するまでwinformがフリーズすることです。 だから私は(Winフォームのfuncionalityを気にしない新しいスレッドを開くために私を有効に)バックグラウンドワーカーを使用:C#winformから頑強なタスクを終了します

private void bgw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
    { 
     string fileName = (string)e.Argument; 
     ExecuteTest(fileName); 
    } 

を、私はに行くことに気づいた「デバッグ!」メッセージが、コマンドプロセスが死なない:

private void tsbStopRun_Click(object sender, EventArgs e) 
    { 
     Process prc1 = GetProcess("cmd"); 
     KillProcess(prc1); 
    } 

    private Process GetProcess(string processName) 
    { 
     Process[] Prc = Process.GetProcessesByName(processName); 
     if (Prc.Length > 0) 
      return Prc[0]; 
     else 
      return null; 
    } 

    private void KillProcess(Process prc) 
    { 
     if (prc != null) 
     { 
      prc.Kill(); 
      MessageBox.Show("debug!"); 
     } 
    } 

を私はコマンドタスクを開き、停止ボタンをクリックすると、ところで、コマンドタスクが殺される...

はどのような背景を殺すことができます停止ボタンからの作業者のコマンドタスク...?

答えて

2

MSDN

からキル方法は非同期に実行されます。 Killメソッドを呼び出した後、WaitForExitメソッドを呼び出してプロセスが終了するのを待つか、HasExitedプロパティをチェックしてプロセスが終了したかどうかを確認します。

つまり、Killは、一定期間プロセスを停止できない可能性があります。

終了コードを待つようにKillProcessメソッドを変更し、応答にかかる時間を確認します。 Killが作業を待っている間に終了するのを待っていることをユーザーに警告する必要があります。

private void KillProcess(Process prc) 
{ 
    if (prc != null) 
    { 
     prc.Kill(); 
     prc.WaitForExit(); //this has an [override][2] in which you can specify time 
     MessageBox.Show("debug!"); 
    } 
} 
1

あなたが見たプロセスを記憶しておく必要があります。

private Process _commandProcess = null; 

private void tsbStartRun_Click(object sender, EventArgs e) 
{ 
    _commandProcess = new Process(); 
    //Start process here. 
} 

private void tsbStopRun_Click(object sender, EventArgs e) 
{ 
    _commandProcess.Kill(); 
    MessageBox.Show("debug!"); 
} 
0

私が書いたカスタムビルドサービスと同様のことをしました。プロセスを追跡するためのプロパティを作成しました。

public Process CurrentProcess { get; set; }

あなたは、バックグラウンドワーカースレッドで仕事をするために行くときに、あなたは、プロセスを初期化して起動することができます。

this.CurrentProcess = new Process(); 
//other initialization 
this.CurrentProcess.Start() 

次に、このプロパティにアクセスしてプロセスを強制終了する必要があります。これを実装する方法によっては、CurrentProcessプロパティがnullかどうか、またはバックグラウンドワーカーが実行中であっても、プロセスを強制終了しようとする前にチェックすることができます。

this.CurrentProcess.Kill() 
関連する問題