狂※痴(zhangleixp)

暂无签名

  • 博客访问: 214206
  • 博文数量: 55
  • 用 户 组: 普通用户
  • 注册时间: 1970-01-01 08:00
个人简介

鏆傛棤浠嬬粛

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类
文章存档

2006年(55)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

分类: 网络与安全

附注

全部代码贴在下面,也可以从以下地址下载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 环境下,都是一样。

问题

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

参见我CSDN上的这篇文章,代码显示较好:

http://blog.csdn.net/zhangleixp/archive/2006/08/02/1009535.aspx

[@more@]

程序清单

//// Worker.cs//using System;using System.Text;using System.Threading;using System.Collections;namespace WeirdTimer
{
public class Worker
{
/// /// 创建的对象的计数。/// int _objectCount = 0;
/// /// Do 方法执行的次数。/// int _doCount = 0;
/// /// 链表,用于保存创建对象的引用。/// ArrayList _list = new ArrayList();
/// /// 对象的所占内存空间的大小。(字符数)/// int _objectSize = 10000;
/// /// 是否使用定时器。/// public static bool IsTimerUsed = true;

/// /// Do 方法。作为 Timer 的回调函数。/// 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() + " 个对象已创建。");
}
}
/// /// 启动 Do 操作。/// 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();
}
}
}

阅读(5252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册