0 0

C# System.Windows.Forms.Timer导致内存一直增加10

采用forms.Timer的标准用法,如:
this.timer1.Enabled = true;
            this.timer1.Interval = 1000;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

我把this.timer1_Tick全部去掉,也不是以每秒4个字节的长度增加。不去也是一样,导致一天下来,就内存溢出。
当把上面的定时器注释掉,就不长内存了。

winform在最小化的时候能释放内存,于是在采用程序模拟这种动作,是释放内存,好像解决了问题,但是在运行一天下,
还是占了很多内存,原来一天就溢出,现在二天才溢出。

想请教一下,有谁碰到类似的情况?有什么好的解决方法。

因为我们要采用forms.Timer的线程安全的Timer,就是quartz中有状态的Timer,第一次任务完成才能运行第二个任务。
如果采用别的Timer,有没有好的解决方法?

不甚感激。
问题补充:
这是this.timer2_Tick的代码
private void timer2_Tick(object sender, EventArgs e)
        {          
            if (this.RunState == true) //如果程序运行状态为运行
            {
                timer2.Interval = this.Timer2Length;
                try
                {
                    txt_ErrMsg.Text = "start";
                    RecvFlow();//这两行是功能,就是注释也是一直长内存
                    SendFlow();

                    //如果运行到这里还没有出错,则表明可以正常运行

                    this.Timer2Length = 1; //程序出错的话,改为正常运行
                    this.TimerLength = 1000;
                    txt_ErrMsg.Text = "目前软件运行正常";

                }
                catch (Exception ex) //捕获异常
                {
                    txt_ErrMsg.Text = ex.Message;
                    this.Timer2Length = 300000; //程序出错的话,改为每5分钟重试一次
                    this.TimerLength = 300000;
                    try
                    {
                        ShortMsg sm = new ShortMsg();
                        sm.SendMsg("短信平台错误:" + ex.Message, 8, 1, "106573077777", "15879006238", "错误提示设定");
                    }
                    catch { }
                }
            
            }

          
        }
我没有采用画刷之类的,
因为form.times是线程安全的,采用for,或嵌套,其它的定时器形式都会死啦。估计是线程上出了问题。
我采用lock(static date)保证了线程安全.但是行不通。
问题补充:
其实我强行采用了System.GC.collect(),同时注释了功能的代码,就是定时器在空转,还是长内存,不过好象慢了一点点。但是没有实质的作用。

代码采用了两个定时器,timer1_Tick是从数据库取一批数据,放在内存中。比如100条。timer1_Tick每s都判断这一批数据是否处理完,处理完就再取。
timer2_Tick是完成处理这一批的功能。处理完一条就删除一条。之后发送出去。
2008年8月13日 08:21

4个答案 按时间排序 按投票排序

0 0

如果定时器只是一个判断的开关作用的话
去掉吧
用事件机制

2008年8月13日 21:09
0 0

因为这一部分的对象,C#不会帮助你把自动释放的。

2008年8月13日 15:36
0 0

注意一些Graphic , from, 尤其和画图相关的对象不用之后
是否被Dispose掉。。

注意: 不用的画笔,之类的一定要及时Dispose掉!!!!!!

2008年8月13日 15:35
0 0

第一次任务完成才能运行第二个任务

仅仅是实现这个的话
使用自定义event来做(使用一个任务链,在每个任务完成后,触发onComplete事件,在此事件里启动后续任务)
不需要timer 也就没有内存问题

2008年8月13日 10:08

相关推荐

    C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一、System.Windows.Forms.Timer 1、基于Windows消息循环,用事件方式触发,在界面线程执行;是使用得比较多的Timer...

    C#中Timer使用及解决重入问题

    与Windows Forms中的`System.Windows.Forms.Timer`不同,`System.Timers.Timer`在控制台应用或服务中更常见。 使用`System.Timers.Timer`非常直观,主要包括以下几个步骤: 1. 实例化Timer对象,设置间隔时间。例如...

    使用C#开发的类似QQ聊天工具的小软件

    使用C#开发的类似QQ聊天工具的小软件 ... private System.Windows.Forms.Timer timer1; private string SysInf; private System.ComponentModel.IContainer components; public Online(string sysi

    C#三种定时器实现例子:Timer_Test.rar

    本示例项目“Timer_Test.rar”提供了三种不同类型的定时器的实现:System.Windows.Forms.Timer、System.Timers.Timer和System.Threading.Timer。每种定时器都有其特定的应用场景和特性,下面将详细介绍这三种定时器...

    C#使用定时器Timer

    与 `System.Windows.Forms.Timer` 相比,`System.Timers.Timer` 更适用于长时间运行的应用程序,因为它可以在应用程序的主线程暂停或挂起时继续运行,提供更精确的时间间隔控制。 #### 三、`System.Timers.Timer` ...

    C#Timer.zip

    在C#编程语言中,`System.Timers.Timer` 和 `System.Windows.Forms.Timer` 是两种常见的计时器组件,用于实现不同场景下的定时任务。在这个"C#Timer.zip"压缩包中,我们可以推测它包含了一个简单的C#计时器应用示例...

    C#_Timer及多线程编程

    根据给定的文件信息,我们将重点放在理解和解释C#中的`System.Windows.Forms.Timer`以及其在多线程编程中的应用。 ### C#的Timer解析 #### System.Windows.Forms.Timer `System.Windows.Forms.Timer`是一个用于...

    C#中三种定时器对象的比较

    C#中提供了三种类型的计时器:基于 Windows 的标准计时器(System.Windows.Forms.Timer)、基于服务器的计时器(System.Timers.Timer)和线程计时器(System.Threading.Timer)。每种计时器都有其特点和使用场景,...

    timer事件的用法

    本文将详细介绍在C#编程语言中三种不同的定时器实现方式:`System.Windows.Forms.Timer`、`System.Timers.Timer`以及`System.Threading.Timer`。这三种定时器各有特点,适用于不同场景。 #### 二、`System.Windows....

    C#定时器(Timer)

    C#中的Timer类主要存在于System.Threading命名空间下,有两种常见的类型:`System.Threading.Timer` 和 `System.Windows.Forms.Timer`。前者适用于多线程环境,后者主要用于Windows Forms应用程序,与UI交互更紧密...

    c#各种Timer类的区别与用法介绍

    System.Threading.Timer 是一个简单的轻量计时器... 多线程计时器1:System.Threading.Timer2:System.Timers.Timer特殊目的的单线程计时器:1:System.Windows.Forms.Timer(Windows Forms Timer)2:System.Windows.

    C# 俄罗斯方块游戏

    this.timer1 = new System.Windows.Forms.Timer(this.components); this.panel3 = new System.Windows.Forms.Panel(); this.textBox1 = new System.Windows.Forms.TextBox(); this.label4 = new System....

    C# TIMER 的用法

    本文将详细介绍`System.Windows.Forms.Timer`、`System.Timers.Timer`以及`System.Threading.Timer`三种不同类型的`TIMER`对象,并通过实例演示它们的基本用法。 #### 二、System.Windows.Forms.Timer `System....

    C#经典范例50讲

    private System.Windows.Forms.Timer timer1; private System.Windows.Forms.NumericUpDown ndHour; private System.Windows.Forms.NumericUpDown ndMinute; private System.Windows.Forms.Button btn_OK; ...

    C#定时器的用法

    本文将详细介绍C#中的三种定时器类:`System.Windows.Forms.Timer`、`System.Threading.Timer`以及`System.Timers.Timer`,并分别给出示例代码和应用场景。 #### 二、`System.Windows.Forms.Timer` 类 `System....

    winform c# ProgressBar特殊样式style

    1. **创建自定义控件**:首先,我们需要继承`System.Windows.Forms.UserControl`类,并重写`OnPaint`方法。 2. **绘制背景**:在`OnPaint`方法中,使用`Graphics`对象的`FillRectangle`方法绘制进度条的背景,可以...

Global site tag (gtag.js) - Google Analytics