2013-04-15 36 views
7

私はC#の新機能ですので、疑問に思うかもしれません。私は時々ffmpegを実行する必要があるアプリケーションを開発しています。あなたが推測するように、このffmpegプロセスは、ホストアプリケーションが閉じられたときに終了しなければなりません。私はこの作業のために、このようなコードを使用します(それはインターフェースまたはTaskmanでのヴィア - アプリケーションが)C#:プロセスの終了時にプロセスが終了する(タスクマンで)

AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); 
private void OnProcessExit(object sender, EventArgs e) 
    { 
     proc.Kill(); 
    } 

アプリが正しく閉じられているときに、正常に動作します。問題は、(Taskman - Processesを使用して)プログラムのプロセスが終了した場合、OnProcessExitイベントがトリガされないことです。私が知る限り、殺害プロセスとクローズプログラムのアクションは低レベルでは同じではありませんが、殺害プロセスはコマンドであり、C#ツールで処理することができます。ですから、この場合子プロセスを閉じることは可能でしょうか?

+3

[この質問](http://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed?rq=1)会談親は殺される。 –

+0

ありがとう、スコットミラー、[this] [1] 方法は私の問題を解決するために必要です。 [1]:http://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed?rq=1 – JustLogin

+3

いいえ、それは悪い考えです。ユーザーが何か不合理なことをしたときに合理的なことをしようとするのは無駄な努力です。なぜあなたはこのようなあなたのプログラムを殺すことにしたのか分かりません。しかし、あなたのプログラムはまだ正常に動作しているわけではないと通常仮定します。あなたがffmpegを殺すために何をしようとしていても、良い結果になるのは、それに応じてスリムです。ジョブオブジェクトは解決策でもなく、Vistaでひどく壊れてしまった。今は2つの問題があります。 –

答えて

1

私は(スコット・ミラーの提案どおりに)ジョブオブジェクトを使用することをお勧めします。この

Application.Exit(); 
0

を試してみてくださいね。 別のオプションは、次のないアプリの特別なヘルパーアプリを持っていることができます。

    は、あなたのアプリがクラッシュしたときに、あなたのアプリケーション
  • を起動して後にクリーンアップ

しかし、ジョブオブジェクトこの

0

は、ホスト・プログラムは、パラメータとして、そのプログラムIDを提出 して、プログラムが終了する場合には耳を傾けてみましょうことが、特に作られた、間違いなく良いオプションです。とき、その子プロセスを殺す程度

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      if (args.Length != 0) 
       new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(handelexit)).Start(args[0]); 

      // your code here 
     } 

     static void handelexit(object data) 
     { 
      int id = System.Convert.ToInt32(data.ToString()); 

      System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(id); 
      while (!p.HasExited) 
       System.Threading.Thread.Sleep(100); 

      System.Environment.Exit(0); 
     } 
    } 
}