ITPub博客

首页 > Linux操作系统 > Linux操作系统 > .net中的游魂现象

.net中的游魂现象

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-08-10 14:49:48 0 删除 编辑

在使用timer的时候,发现timer类型对象的作用于比较奇特。一般而言,在函数内定义的变量,其作用域不超过函数,在函数结束的时候变量的生命周期就结束了,但是万事里总会有个一,普遍规律下总有那么一些例外的东西,比如说timer,其作用域就不会因函数的结束而结束。考察以下事件处理函数,
        private void button1_Click(object sender, EventArgs e)
        {
            System.Timers.Timer t = new System.Timers.Timer();
            t.Interval = 1000 * 2;
            t.Elapsed += delegate
            {
                MessageBox.Show(System.DateTime.Now.ToString());
            };
            t.Start();
        }

按完button1按钮后,timer持续运行,每隔约2秒就会弹出一个msgbox显示当前时间,当然,因为我们已经失去了t这个变量,表面上也就无法终止这个timer了(也许有办法终止吧)。对于这种现象,我推测是两种原因造成的。一,timer是对windows内核对象的包装,上面这段托管代码的底层调用了来自windows的一些内核对象,在超离作用域的时候,没有对内核对象进行相应的处理,当然这只是推测,我现在没有精力去证实。其二:使用了多线程技术,考察以下代码,

           System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() {
                for (int i = 0; i < 6; i++)
                {
                    System.Threading.Thread.Sleep(3000);
                    MessageBox.Show("I'm in thread");
                }
     
            }));
            t.Start();
            MessageBox.Show("end of click");

以上两段代码,现象是类似的,为将其称之为游魂现象——看上变量已经死了,实际上依然存在,原理尚有待研究。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-611752/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5304416