2013-09-24 21 views
0

我的程序有事件onClosing - 只是隐藏它。但我也需要实现关闭程序 - 尝试使用任务栏通知项目的上下文菜单。如何正确结束程序的所有过程

代码:

private void FormMainForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     //canceling closing form 
     e.Cancel = true; 
     //hide form 
     this.WindowState = FormWindowState.Minimized; 
    } 

    private void toolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     //hide icon from tray 
     notifyIcon.Visible = false; 
     //get current process 
     Process proc = Process.GetCurrentProcess(); 
     //kill it and close programm 
     proc.Kill(); 
    } 

而且还读了一点点,那kill()终止所有工作,并“杀”的过程中,认为它可以是不正常的方式关闭PROGRAMM - 一些数据可以被摧毁或不能存储

也尝试使用proc.closeMainWindow();proc.Close() - 但对程序没有影响 - 所有窗口关闭,但进程仍在运行。

问题:是.kill()这是一个关闭程序的正确方法,或者它是另一种方法吗?

+3

这是一样的,如果你从任务管理器杀死它。这是正确的方式吗? –

+0

您是否使用前景线程?如果不使用'Application.Exit()' –

+1

另一种选择:'Environment.Exit(0);'。 – Sam

回答

5

你可以只调用.Close()在你的菜单项上点击设置一个布尔标志,以便的OnClose处理程序可以检查标志,并知道它应该真的接近。这比尝试杀死自己的过程要安全得多。

private bool onlyHideOnClose = true; 

private void FormMainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(this.onlyHideOnClose) 
    { 
     e.Cancel = true; 
     this.WindowState = FormWindowState.Minimized; 
    } 
} 

private void toolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    this.onlyHideOnClose = false; 
    this.Close(); 
} 
+0

作品完美! – gbk