7

我对 C# 很陌生,所以我的问题听起来很荒谬。我正在开发一个有时需要运行 ffmpeg 的应用程序。正如您所猜测的,当它的主机应用程序关闭时,这个 ffmpeg 进程必须被杀死。我使用这样的代码来完成这个任务:

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

当应用程序正确关闭时(通过它的界面或使用 Taskman - 应用程序),这可以正常工作。问题是 OnProcessExit 事件不会触发,如果程序的进程被杀死(使用 Taskman - Processes)。据我所知,在底层杀死进程和关闭程序动作是不一样的,但我想,杀死进程是对它的命令,可以用C#工具来处理。那么,在这种情况下是否可以关闭子进程?

4

3 回答 3

1

我想试试这个

Application.Exit();
于 2013-04-18T07:05:38.477 回答
0

我建议使用工作对象(根据 Scott Miller 的建议)。另一种选择是为您的应用程序提供特殊的帮助应用程序,它执行以下操作:

  • 启动您的应用
  • 当您的应用程序崩溃时,请对其进行清理。

但是工作对象绝对是更好的选择,它专门为此而生

于 2013-05-16T11:19:09.083 回答
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);
        }
    }
}
于 2013-05-17T12:01:37.200 回答