浅析.NET游魂现象

开发 后端
在使用timer的时候,发现timer类型对象的作用于比较奇特。一般而言,在函数内定义的变量,其作用域不超过函数,在函数结束的时候变量的生命周期就结束了,这里将介绍.NET游魂现象。

万事里总会有个一,普遍规律下总有那么一些例外的东西,比如说timer,比如说.NET游魂现象,其作用域就不会因函数的结束而结束。考察以下.NET游魂现象处理函数,

  1. private void button1_Click(object sender, EventArgs e)  
  2. {  
  3.     System.Timers.Timer t = new System.Timers.Timer();  
  4.     t.Interval = 1000 * 2;  
  5.     t.Elapsed += delegate  
  6.     {  
  7.         MessageBox.Show(System.DateTime.Now.ToString());  
  8.     };  
  9.     t.Start();  

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

  1. System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() {  
  2. for (int i = 0; i < 6; i++)  
  3.  {  
  4. System.Threading.Thread.Sleep(3000);  
  5. MessageBox.Show("I'm in thread");  
  6.                 }  
  7.        
  8.             }));  
  9. t.Start();  
  10. MessageBox.Show("end of click"); 

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

【编辑推荐】

  1. 简单介绍C#预处理
  2. 学习C#无词尾符号经验谈
  3. C#调用QuickTest自动化
  4. 详解C#正规表达式
  5. C#字符串插入html标签
责任编辑:彭凡 来源: cnblogs
相关推荐

2010-01-18 16:26:46

VB.NET数组赋值

2009-09-10 14:47:53

Linq .NET查询

2009-09-14 13:37:25

LINQ ADO.NE

2009-07-24 13:41:15

ASP.NET AJA

2009-08-05 18:36:12

ASP.NET Che

2009-07-31 12:43:59

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET优点

2009-07-24 18:02:46

ASP.NET编程

2009-08-05 16:50:09

ASP.NET For

2009-08-04 17:16:16

ASP.NET代码优化

2009-08-05 16:17:29

ASP.NET For

2009-08-05 16:53:14

ASP.NET组件设计

2009-08-03 10:07:20

ASP.NET Ses

2009-08-25 18:16:02

.NET Framew.NET Framew

2009-08-05 13:16:43

ASP.NET URL

2009-08-10 18:19:37

ASP.NET安装环境

2009-08-10 14:55:43

ASP.NET htt

2009-08-24 16:19:54

C#.NET绑定Off

2009-07-27 15:34:11

MembershipASP.NET

2009-07-29 09:34:54

IsPostBack属ASP.NET
点赞
收藏

51CTO技术栈公众号