c#在父应用程序关闭时关闭子应用程序

本文关键字:应用程序 | 更新日期: 2023-09-27 18:15:14

我想关闭子应用程序(这是fileViewer:Window)时,它的父应用程序将被关闭。

注意:这个父应用程序不是主应用程序。

这意味着我有一个c# winform应用程序,它有3个级别。

1是主应用程序二是主应用的子应用第三是第2

的子应用

当我关闭第二个应用程序时,我希望第三个应用程序将自动关闭。

这个线程在应用程序关闭时关闭另一个进程是非常有用的,但我不知道在哪里调用process.close()fileViewer.FileBrowser.Dispose();等方法

public void OpenNewInstanceOf2nd()
{
    //Use .NET Diagnostics to start a new process off the 2nd
    try
    {
        System.Diagnostics.Process.Start(MyFramework.FileSystem.ApplicationPath + MyProperties.MyAssemblyName);
    }
    catch (Exception ex)
    {
        MyFramework.Debug.LogException(ex, "Could not open the My Utility");
    }
}

c#在父应用程序关闭时关闭子应用程序

如果它只是一个窗体,你可以设置窗体3的所有者为窗体2。如果你关闭了第二窗体,第三窗体也会关闭。

private void Form2nd_Load(object sender, EventArgs e)
{
  Form3rd form_3rd = new Form3rd();
  form_3rd.Show(this);
}

如果它是一个嵌套的进程/工作线程,为什么不在第二个表单/应用程序中保留一个引用,并在第二个应用程序关闭时处理它?

如果我正确理解你的问题,你有3个不同的进程,其中最后两个是由前一个创建的:

Proc1> Proc2> Proc3

我想问你的第一件事是,你是否真的需要这样的设置。如果一切都在你的控制之下,你应该考虑创建一个进程,但如果出于某种原因你真的需要这样做(即你需要运行其他命令行实用程序),让我们继续…

如果你在代码中创建了"子"进程,你可以保留引用:

Process proc2 = Process.Start("proc2.exe");

,然后关闭进程:

proc2.CloseMainWindow();
proc2.Close();

如果你不能控制Proc2,你可以使用

从Proc1获得Proc3的引用
Process.GetProcessesByName("proc3.exe");

请记住Process.CloseMainWindow()只适用于有窗口的应用程序,它对命令行实用程序毫无用处。控制其他第三方流程可能很棘手,这实际上取决于它们是如何实现的,所以我不能更具体。


在评论的细节之后,我将添加以下内容:如果你从你自己的代码启动Proc2,你可以有一个引用到它的Process对象,所以你可以注册到exit事件,并在那一点搜索和关闭Proc3:

proc2 = Process.Start("HelpViewer.exe");
proc2.Exited += new EventHandler(proc2_Exited);
proc2.EnableRaisingEvents = true;

void proc2_Exited(object sender, EventArgs e)
{
    //Unregister the event and free the object resources
    proc2.Exited -= new EventHandler(proc2_Exited);
    proc2.Close();
    //Search and close the other process(es)
    Process[] processes = Process.GetProcessesByName("HelpViewer.exe");
    foreach(Process process in processes)
        process.CloseMainWindow();
}

如果您不从代码中启动Proc2,那么就没有简单的解决方案。