难道定时器受到内存的限制?
来源:互联网 发布:netgear访客网络设置 编辑:程序博客网 时间:2024/05/16 01:32
附注:
全部代码贴在下面,也可以从以下地址下载VS2003 Project:http://zhangleixp.itpub.net/get/13774/WeirdTimer_SRC.rar。
程序说明:
1、Start 方法可以有两种方式启动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();
}
}
}
// 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();
}
}
}
- 难道定时器受到内存的限制?
- JVM中的哪些内存总和受到操作系统进程的最大内存限制?
- 网址受到robots.txt的限制
- JS编码风格受到ES6的限制
- 功能当前受到限制
- .NET的内存限制
- 限制应用的内存
- DB2中,LONG VARCHAR 数据类型的使用会受到什么语句的限制呢?
- 虚拟存储的容量受到下列哪一个因素的限制影响最大?
- oracle 11g memory_target大小受到 /dev/shm可以空间的限制
- .Net用UploadFile控件上传文件受到大小限制的解决办法
- 网络故障:本地连接受到限制或者是有个黄色的叹号,默认网关是0.0.0.0
- 定时器造成的内存泄露
- j2ee的web项目的定时器,不用受到拦截器的拦截,因为根本不是http url请求
- 受到
- 限制 Xen Dom0 的内存
- java 虚拟机的内存限制
- 增加 Drupal 的内存限制
- 驳多核无用论-转载自孟岩的blog
- 计算机科学与技术到底是什么?
- ASP 导出 Excel 数据的四种方法
- Network Protocol Pages
- Usb Device Drivers
- 难道定时器受到内存的限制?
- Transact-SQL游标是如何工作的
- SNC
- 使用系统表存储标记
- 两个日期javascript控件
- 如何申请@MSN.Com后缀的邮箱?
- 2006.8.2 工作计划
- Google对付桥页作弊的方法
- VISITOR模式--《敏捷软件开发》读书笔记(三)