Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#关闭子应用程序时';的父应用程序正在关闭_C#_.net_Winforms - Fatal编程技术网

C#关闭子应用程序时';的父应用程序正在关闭

C#关闭子应用程序时';的父应用程序正在关闭,c#,.net,winforms,C#,.net,Winforms,我想在关闭子应用程序(即fileViewer:Window)的并行应用程序时关闭它 注意:此parrent应用程序不是主应用程序 这意味着我有三个级别的C#winform应用程序 第一个是主要应用 第二个是主应用程序的子应用程序 第三个是第二个的子应用程序 当我关闭第二个应用程序时,我希望第三个应用程序将自动关闭 这个线程非常有用,但我不知道在哪里调用process.close()或fileViewer.FileBrowser.Dispose()etc方法 public void OpenNew

我想在关闭子应用程序(即fileViewer:Window)的并行应用程序时关闭它

注意:此parrent应用程序不是主应用程序

这意味着我有三个级别的C#winform应用程序

第一个是主要应用 第二个是主应用程序的子应用程序 第三个是第二个的子应用程序

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

这个线程非常有用,但我不知道在哪里调用
process.close()
fileViewer.FileBrowser.Dispose()etc方法

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");
    }
}

如果只是要关闭的表单,可以将表单3的所有者设置为表单2。如果您关闭第二表,第三表也将关闭

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

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

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

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

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

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

Proc1>Proc2>Proc3

我想问你的第一件事是,你是否真的需要这样的设置。如果一切都在你的控制之下,你应该考虑做一个单一的过程,但是如果出于某种原因,你真的需要这样做(即你需要运行其他命令行实用程序),让我们继续……/P> 如果在代码中创建“子”进程,则可以保留引用:

Process proc2 = Process.Start("proc2.exe");
然后关闭流程:

proc2.CloseMainWindow();
proc2.Close();
如果您对Proc2没有控制权,可以使用从Proc1获取对Proc3的引用

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


在评论中的细节之后,我将添加以下内容: 如果您从自己的代码启动Proc2,则可以引用其流程对象,这样您就可以注册到退出的事件,并在该点上搜索并关闭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,则没有简单的解决方案。

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

Proc1>Proc2>Proc3

我想问你的第一件事是,你是否真的需要这样的设置。如果一切都在你的控制之下,你应该考虑做一个单一的过程,但是如果出于某种原因,你真的需要这样做(即你需要运行其他命令行实用程序),让我们继续……/P> 如果在代码中创建“子”进程,则可以保留引用:

Process proc2 = Process.Start("proc2.exe");
然后关闭流程:

proc2.CloseMainWindow();
proc2.Close();
如果您对Proc2没有控制权,可以使用从Proc1获取对Proc3的引用

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


在评论中的细节之后,我将添加以下内容: 如果您从自己的代码启动Proc2,则可以引用其流程对象,这样您就可以注册到退出的事件,并在该点上搜索并关闭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,则没有简单的解决方案。

什么链接?看起来您是意外删除的。您的意思是关闭父应用程序正在关闭的“工作”进程吗?为此,您需要某种形式的进程间通信(有很多选择,最好的是:需要更多的上下文)。否则,请修改问题以澄清。您是否将这些申请表作为同一流程或exe的一部分开发?或者你是在每一级启动不同的程序?@Richard:当我按下交叉[X]按钮时,应用程序就关闭了。我想找到我可以编写代码的地方。实际上,这是一个非常大的应用程序,我对它还不熟悉。@多项式:请现在检查,链接正在工作。请告诉我应该在哪里调用dispose()方法,这样子应用程序就会自动关闭。什么链接?看起来您是意外删除的。您的意思是关闭父应用程序正在关闭的“工作”进程吗?为此,您需要某种形式的进程间通信(有很多选择,最好的是:需要更多的上下文)。否则,请修改问题以澄清。您是否将这些申请表作为同一流程或exe的一部分开发?或者你是在每一级启动不同的程序?@Richard:当我按下交叉[X]按钮时,应用程序就关闭了。我想找到我可以编写代码的地方。实际上,这是一个非常大的应用程序,我对它还不熟悉。@多项式:请现在检查,链接正在工作。请告诉我应该在哪里调用dispose()方法,这样子应用程序就会自动关闭。我想处理它,但这是一个很大的应用程序,不是我开发的。因此,我找不到应该在哪里调用dispose()。@khokar-如果你有权访问代码,你就必须找到它。我们不能告诉你。我想处理它,但这是一个非常大的应用程序,不是我开发的。因此,我找不到应该在哪里调用dispose()。@khokar-如果你有权访问代码,你就必须找到它。我们无法告诉您。第二个和第三个应用程序实际上是同一个过程,如taskmanager中所示。第三只是一个帮助文件查看器,它是通过点击第二的超链接打开的。当我通过单击Cro关闭第二个