首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

解决有关问题马下给分

2012-07-30 
解决问题马上给分我用timer_tick时间 每30分钟 去执行,取设备里的信息,昨天晚上9点开启后,今天早上来程序

解决问题马上给分
我用timer_tick时间 每30分钟 去执行,取设备里的信息,昨天晚上9点开启后,今天早上来程序还在运行,可是取一个设备信息
由刚开始的5秒变成了2分钟。 
是何原因?

C# code
public class 线程操作类{  public object 设备信息;  public void 读取数据方法()  {  //读取并写入数据库  }}timer_Tick(object sender, EventArgs e){     BackgroundWorker[] bgws = new BackgroundWorker[设备总数];     线程操作类[] temps = new 线程操作类[设备总数];    for(int i=0;i<设备总数,i++){    //实例化线程和线程操作类    bgws[i] = new BackgroundWorker();    temps[i] = new 线程操作类();   //设置线程工作的方法    bgws[i].DoWork += new DoWorkEventHandler(temps[i].读取数据方法);    //启用线程    bgws[i].RunWorkerAsync()}}


[解决办法]
探讨
我也有个疑问 针对bgws[i].DoWork += new DoWorkEventHandler(temps[i].读取数据方法);
不须要bgws[i].DoWork -= new DoWorkEventHandler(temps[i].读取数据方法);吗?

[解决办法]
.NET内存不可能不会自动释放的,除非是有内存泄漏的情况(非托管内存没释放),而这种情况即使你GC强制回收都无法回收到。
程序要长时间工作的话,必须编译为Release版本,Release版本将对代码进行优化,大大提高了自动释放内存的速度,当某个对象离开了作用域将立刻释放其内存。
这里不应该使用BackgroundWorker,既然用了定时器,又需要异步执行,则应该直接使用System.Timers.Timer这个类,它非常适合你现在的应用,关于这个类的介绍,自己查看MSDN,我这里只是简单说下怎么使用。
C# code
            System.Timers.Timer timer = new System.Timers.Timer(5000);            for (int i = 0; i < 设备总数; i++)            {                int j = i;//必须再给一个 变量,否则后面的委托将用i的最后一个值                timer.Elapsed += delegate                 {                    //这里写对应设备的处理方法                    temps[j].读取数据方法                };            }            timer.Start(); 

热点排行