在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源。这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug。本文列举可能影响.NET程序进程退出的 ...
在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源。这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug。本文列举可能影响.NET程序进程退出的因素,并用几个小例子说明这些因素如何导致Form Application和Windows Service的Bug。
一、进程不能退出对于某些Windows Form程序的影响
在传统C/S结构的系统中,客户端会通过Socket或WCF服务利用特定的端口与服务端保持通信。因此在很多应用场景中,为避免端口冲突,单台计算机同一时刻只允许启动一个客户端,这也符合一个客户端代表单个用户角色的业务设计。这可以通过Mutex类,或者在客户端启动时检查是否已有同名的进程存在来实现。有些客户端启动逻辑被设计成当存在已有进程时,不初始化用户界面,而是自动切换到已经打开的客户端并关闭自身。
在这种情况下,如果前一次从客户端界面中退出,但是进程没有关闭,那随后再次启动客户端时就再也无法正常显示出用户界面,除非手动杀掉进程再次启动。
二、Foregroundget='_blank'>线程导致进程无法退出的例子
用如下代码来模拟进程无法退出的情况。简单起见,这个小窗口程序没有任何网络或数据库操作,仅仅是用一个线程定时刷新UI。设想是当程序界面构建完成后启动一个Thread,随后每隔1秒刷新当前时间,当点击窗体关闭按钮之后,程序退出,Thread和进程一同被销毁。
1 public partial class Form1 : Form 2 { 3 Thread worker = null; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 Load += new EventHandler(Form1_Load); 9 }10 11 void Form1_Load(object sender, EventArgs e)12 {13 worker = new Thread(new ThreadStart(DoWork));14 worker.Start();15 }16 17 private void DoWork()18 {19 while (true)20 {21 Thread.Sleep(1000);22 if (IsHandleCreated && !IsDisposed)23 {24 Invoke((MethodInvoker)(() => label1.Text = DateTime.Now.ToString()));25 }26 }27 }28 }
原标题:是什么在.NET程序关闭时阻碍进程的退出?
关键词:.NET
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。