`
king_tt
  • 浏览: 2111204 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

.NET 强制退出WinForm程序 C#+.NET

 
阅读更多
这几天在做一个把大量Infopath生成的XML数据,进行处理的程序,我用了MDI子窗体,每个窗体包含了各自的功能,如,遍历目录及其子目录检查文件类型并自动生成Sql语句并入库、对Infopath数据的自动检查、对数据中的某些域的替换及更改处理、对数据文件的合并、拆分、剔除记录、统计数据、对数据自动导入数据库。。。等等。
<wbr><wbr><wbr><wbr><wbr>当我打开一个子窗体,进行某项操作时,如果字窗体中有循环操作时。如果运行中我关闭子窗体,发现窗体虽然关闭了,但子窗体中的循环程序却没有退出,一直在执行,并占用着系统资源,直到循环结束,才真正的释放资源。尽管我在字窗体的Closed事件中写了如下代码:<br><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr>private void frmFileDisposal_Closed(object sender, System.EventArgs e)<br><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.Dispose();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.Close();<br><wbr><wbr><wbr><wbr>}<br><wbr>后来从查MSDN和从网上查资料才得知,Dispose()方法,虽然能释放当前窗体的资源,却不能强制结束循环,<br><wbr>要想强制突出当前程序要用:System.Environment.Exit(int exitcode)方法;该方法:终止当前进程并为基础操作系统提供指定的退出代码。 <p>如下则问题解决:<br><wbr><wbr>private void frmFileDisposal_Closed(object sender, System.EventArgs e)<br><wbr><wbr><wbr><wbr>{ <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>System.Environment.Exit(System.Environment.ExitCode); <wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.Dispose();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>this.Close();<br><wbr><wbr><wbr><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p> <p>或者把它放到事件里:<br><wbr><wbr>while (MessageBox.Show("退出当前窗体?", "", MessageBoxButtons.YesNo) == <wbr><wbr>DialogResult.No)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr>for(int j=1; j&lt;=i; j++)<br><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>listBox1.Items.Add(j);<br><wbr><wbr><wbr><wbr><wbr><wbr>} <wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr>}<br><wbr><wbr>System.Environment.Exit(System.Environment.ExitCode); <wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p> <p>还有一种方法: <wbr>System.Threading.Thread.CurrentThread.Abort();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>或者 <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Process.GetCurrentProcess().Kill()<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>或者 <wbr><wbr><wbr><wbr><wbr><wbr><wbr>Application.ExitThread();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>或者 <wbr><wbr><wbr><wbr><wbr><wbr><wbr>Application.ExitThread()</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p> <p>不过以上方法,都是强制直接退出了整个程序,不只是关闭子窗体。可能还会引发某些问题,<br> 我感觉最好方法的就是,在子窗体的Closing事件中,写循环退出条件,这样就可以避免某些未知的错误,而且可以只关闭子窗体,并释放子窗体占用的资源</p> <p><wbr>Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口</wbr></p> <p>Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统。</p> <p><br> 在 Windows(Win32 或 .NET)中关闭应用程序的正确方式是关闭它的主应用程序窗口(例如 Form.Close)。主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。我们需要记住,.NET Framework 的 OnClosing() 是 Win32 的托管版本的 WM_CLOSE,而非 WM_DESTROY。</p> <p>另外,如果您使用 form.Close(),通过处理 OnClosing 或 OnClosed 事件,就可以让您的应用程序清理内容、关闭文件等。如果您通过 Application.Exit 强行退出应用程序,就无法调用这些事件。</p> <p>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p> <p><span style="color:#555555">如何退出C#多线成winform程序</span></p> <p>这是项目中碰到的问题。</p> <p>在网上查了下,网上提供的解决方法 :</p> <p> 1,将主线程设置为后台进程。方法是将主线程的isBackground = true。据说,这样在关闭主程序时后关闭主线程,并关闭所有的线程。</p> <p> 但是我这样做没有成功。</p> <p> 2,有人列出了c#程序退出的几种方法:</p> <p> (1)Application.Exit()//好像只在主线程可以起作用,而且当有线程,或者是阻塞方法的情况下,很容易失灵。</p> <p> (2) System.Environment.Exit(0) //无论在主线程或其它线程,都可以吧程序结束干净</p> <p> (3)Application.ExitThread();</p> <p>但是我发现(2)这个方法在.netFrame Work compact下是没有的我这样</p> <p>最后我的解决办法是:强制退出程序进程。代码如下:</p> <div style="background:none repeat scroll 0% 0% transparent">System.Diagnostics.Process tt = System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);<br><br> tt.Kill();</div> <p>当然,这种方法很暴力。良好的程序设计应该是,所有的线程都有条件可以结束循环以退出(包括timer)。在程序退出时触发所有线程的终止条件。</p> </wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics