你的位置:首页 > 软件开发 > ASP.net > 是什么在.NET程序关闭时阻碍进程的退出?

是什么在.NET程序关闭时阻碍进程的退出?

发布时间:2016-03-11 00:00:16
在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源。这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug。本文列举可能影响.NET程序进程退出的 ...

是什么在.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 (#换成@)。