C# 中关闭当前线程的四种方式

来源:互联网 发布:b2b行业网站源码 编辑:程序博客网 时间:2024/05/20 18:20

.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法

.net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应该退出了整个应用程序。
但事实上有时候并不是这样的,关闭窗口,只是停止了当前窗口的消息循环。
系统主窗口,实质上是Main函数中开始消息循环的窗口,这个消息循环结束后,Main函数就基本上完成了历史使命,整个应用程序自然就结束了。
Application.Exit()方法是终止所有线程上的消息循环,一般情况下,无论在什么地方调用此方法,程序就能退出。
但是如果你在程序中加入了某些耗时甚至是死循环的线程,那么即使是消息循环终止,程序也依然不会结束。
比较温和比较合适的做法是结束消息循环之前,终止所有自己新建的线程。
有时候我们连自己也搞不清楚到底是那些顽固的线程在执行,就需要用点暴力的手段了。.net为我们提供了Environment.Exit(0)方法,调用此方法,应用程序即强制退出。

当你打开一个子窗体,进行某项操作时,如果字窗体中有循环操作时。如果运行中我关闭子窗体,发现窗体虽然关闭了,但子窗体中的循环程序却没有退出,一直在 执行,并占用着系统资源,直到循环结束,才真正的释放资源。尽管你在字窗体的Closed事件中写了如下代码:
      
       private void frmFileDisposal_Closed(object sender, System.EventArgs e)
      {
          this.Dispose();
          this.Close();
      }
从查MSDN和从网上查资料可以知道,Dispose()方法,虽然能释放当前窗体的资源,却不能强制结束循环,
   要想强制突出当前程序要用:System.Environment.Exit(int exitcode)方法;该方法:终止当前进程并为基础操作系统提供指定的退出代码。

如下则问题解决:
    private void frmFileDisposal_Closed(object sender, System.EventArgs e)
      {         
          System.Environment.Exit(System.Environment.ExitCode);   
          this.Dispose();
          this.Close();
      }

或者把它放到事件里:
    while (MessageBox.Show("退出当前窗体?", "", MessageBoxButtons.YesNo) ==   DialogResult.No)
     {
       for(int j=1; j<=i; j++)
       {
          listBox1.Items.Add(j);
       }       
    }
   System.Environment.Exit(System.Environment.ExitCode);   

还有一种方法: System.Threading.Thread.CurrentThread.Abort();
                           或者           Process.GetCurrentProcess().Kill()
                            或者        Application.ExitThread();
                            或者        Application.ExitThread()


不过以上方法,都是强制直接退出了整个程序,不只是关闭子窗体。可能还会引发某些问题,
我感觉最好方法的就是,在子窗体的Closing事件中,写循环退出条件,这样就可以避免某些未知的错误,而且可以只关闭子窗体,并释放子窗体占用的资源


Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口

Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统。

在 Windows(Win32 或 .NET)中关闭应用程序的正确方式是关闭它的主应用程序窗口(例如 Form.Close)。主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。我们需要记住,.NET Framework 的 OnClosing() 是 Win32 的托管版本的 WM_CLOSE,而非 WM_DESTROY。

另外,如果您使用 form.Close(),通过处理 OnClosing 或 OnClosed 事件,就可以让您的应用程序清理内容、关闭文件等。如果您通过 Application.Exit 强行退出应用程序,就无法调用这些事件。

Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口
Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统
Environment.Exit(0)方法,调用此方法,应用程序即强制退出

I have a windows form application. It is accessing a backend SQL server. The
data access are wrapped in modules. If the data access failed, I wanted to
display a popup error message and then exit the application. I tried to use
Application.Exit(), Application.ExitThread, and Environment.Exit(). They all
have kind weird problem.
1. Applicaiton.Exit() This method is called within an exception block, after
displaying a message box to the user. It seems it is not doing anything. The
rest of code will be executed in order like nothing happened.

2. Application.ExitThread() The same as Application.Exit()

3. Thread.CurrentThread.Abort() This method will cause ThreadAbort
Exception, so I have to handle this exception from layer to layer.

4. Environment.Exit() In exception catch block, I display the message box,
and then call this method. This caused the application to exit, but the
message box just flashed and disappeared

原创粉丝点击