这几天在做一个把大量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<=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>
分享到:
相关推荐
WinForm gdi+流程图绘制源码,可根据需要修改,注释完整,有操作说明 良心资源
一直琢磨着在winform上也搞一个spring.net+Nhibernate的框架,。这个框架使用的是Spring.NET-1.3.2,NHibernate-3.2.0,在mysql5.1上建了一个user表,字段请各位看映射文件啦(什么?你不懂什么是映射文件?那劝客官...
VB.NET Winform窗口后台运行+防多开+开机后台自动启动示例 可用于制作一个开启自动启动的后台运行程序,并且自带窗口可唤出显示
SunnyUI.NET 是基于.NET Framework 4.0+、.NET6、.NET7 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。.zip
.Net Core WebApi+SignalR+winform实时通信,私人聊天系统。已有功能:添加好友,好友上线通知,切换好友聊天,登录,注册, 支持挂载远程服务器实现超级低配版qq的功能。支持局域网内互发,上课的时候可以偷偷聊天...
酒店管理系统(winform .net3.5 + sql2000 + linq to sql) 参考“东方之星酒店管理系统 2010版”,基于.net3.5 sp1开发框架,C/S架构,采用sql2000/sql2005数据库,采用linq to sql数据访问组件。开发工具为Visual ...
猜数字游戏C#.net实现winform小程序 猜数字游戏C#.net实现winform小程序 猜数字游戏C#.net实现winform小程序
.net framework4.0框架 winform页面 数据分页控件 无其他任何引用 c#语言编写。
C# +WinForm 窗体控制程序 好的东西,花了1个月写出来的 包括3层架构 你们可以好好的参考下 ,有不足之处,希望指教下,谢谢!!!
【ASP.NET编程知识】ASP.NET也像WinForm程序一样运行的实现方法.docx
这是一个ADO.NET程序操作SqlServet数据库带有界面的程序,实现了增删改查,ListView显示数据库数据,一个界面操作多个表
C#(VB.NET)+Winform实现倒数日功能
C# 串口模块 .net框架下winform开发,端口插入自动检测,点击端口名称自动打开串口,无需手动。
SunnyUI.NET 是基于.NET Framework 4.0+、.NET6、.NET7、.NET8 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。
开发语言C#,.net环境下开发。键盘的监听。按下ESC键自动退出程序。
简历内容包含基本信息、学习内容、个人作品、自我评价等,适用于大学应届毕业生寻找工作,简历内容全面通用,适合.NET程序员岗位,计算机服务(系统、数据服务、维修);互联网/电子商务;通信/电信/网络设备;网络...
C#酒店管理系统源码 Visual Studio+Access数据库 你可以改成其他数据库,很好改。 基本的数据库增删改查操作。 包括用户管理,房客管理,客房管理,出入管理等。
C#的基于.net framework的Winform编程例子
SunnyUI.Net, 基于 C# .Net WinForm 开源控件库、工具类库、扩展类库、多页面开发框架
C#,.net,winform上的用于显示svg,操作svg的源代码,示例代码,代码比较齐全,也比较简单,容易上手。