难道定时器受到内存的限制?

 

附注

全部代码贴在下面,也可以从以下地址下载VS2003 Projecthttp://zhangleixp.itpub.net/get/13774/WeirdTimer_SRC.rar

 

程序说明

1Start 方法可以有两种方式启动Do方法:

第一种是使用定时器,

第二种是不使用定时器,直接用一个while(true)循环。

2、该程序是为了更清楚的演示问题而建立,其中创建StringBuilder对象只是为了占用内存而已。

 

奇怪现象

1、如果使用定时器方式,则(以下数据,不同机器上稍不相同,同一机器上有时也不相同)

_objectSize = 100  时,Do方法被执行大约175次;

_objectSize = 1000 时,Do方法被执行大约33次;

_objectSize = 10000时,Do方法被执行大约4次。

2、如果不使用定时器,就不存在上述的问题,Do方法会一直被执行下去,没有次数的限制。

3、在Visual Studio 2003 Visual Studio 2005 环境下,都是一样。

 

问题

难道定时器受到内存的限制?

 

程序清单

 

//
//  Worker.cs
//
using  System;
using  System.Text;
using  System.Threading;
using  System.Collections;

namespace  WeirdTimer
{
    
public   class  Worker
    {
        
///   <summary>
        
///  创建的对象的计数。
        
///   </summary>
         int  _objectCount  =   0 ;

        
///   <summary>
        
///  Do 方法执行的次数。
        
///   </summary>
         int  _doCount  =   0 ;

        
///   <summary>
        
///  链表,用于保存创建对象的引用。
        
///   </summary>
        ArrayList _list  =   new  ArrayList();

        
///   <summary>
        
///  对象的所占内存空间的大小。(字符数)
        
///   </summary>
         int  _objectSize  =   10000 ;

        
///   <summary>
        
///  是否使用定时器。
        
///   </summary>
         public   static   bool  IsTimerUsed  =   true ;


        
///   <summary>
        
///  Do 方法。作为 Timer 的回调函数。
        
///   </summary>
         public   void  Do( object  obj)
        {
            
++ _doCount;
            Console.WriteLine(
" "   +  _doCount.ToString()  +   " 次执行 Do 方法。 " );

            
for ( int  i  =   0 ; i  <   3 ; i ++ )   //  每次执行 Do 创建 3 个 StringBuilder 对象。
            {
                StringBuilder sb 
=   new  StringBuilder(_objectSize);
                _list.Add(sb);

                
++ _objectCount;

                Console.WriteLine(
" 第  "   +  _objectCount.ToString()  +   "  个对象已创建。 " );
            }
        }

        
///   <summary>
        
///  启动 Do 操作。
        
///   </summary>
         public   void  Start()
        {
            
if (Worker.IsTimerUsed)  //  定时器方式
            {
                TimerCallback callback 
=   new  TimerCallback(Do);
                Timer timer 
=   new  Timer(callback,  null 0 500 );
            }
            
else   //  非定时器方式
            {
                
while ( true )
                {
                    Do(
null );
                }
            }
        }

        
public   static   void  Main()
        {
            Console.WriteLine(
" 按回车键退出程序... " );
            Worker aWorker 
=   new  Worker();
            aWorker.Start();
            Console.ReadLine();
        }
    }
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值