[英]C# close the sub application when it's parent application is closing
我想在關閉子應用程序時關閉子應用程序(即fileViewer:Window)。
注意:該上級應用程序不是主應用程序。
這意味着我有3個級別的C#winform應用程序。
第一個是主應用程序,第二個是主應用程序的子應用程序,第三個是第二個子應用程序,
當我關閉第二個應用程序時,我希望第三個應用程序將自動關閉。
當應用程序關閉時,該線程關閉另一個進程 fileViewer.FileBrowser.Dispose();
,但是我不知道在哪里調用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");
}
}
如果只是要關閉的表單,則可以將表單3rd的所有者設置為表單2nd。 如果您關閉Form 2nd,那么Form 3rd也將關閉。
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對象,因此可以注冊到Exited事件,然后搜索並關閉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,那么沒有簡單的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.