删除或替换调用委托C#

时间:2016-02-24 10:40:31

标签: c# multithreading delegates invoke ram

毕竟。我对此并不擅长,希望你无论如何都会理解它。 我在我的程序中创建一个函数,它检查是否突出显示了rtb中的行。如果没有,它会突出显示它。 为此,我必须使用不同的线程才能从不同的地方访问rtb。我的问题是,每次定时器刷新时,它都会创建一个新的"委托" / instance / thread。我想删除旧的线程/委托或用新的替换它。 因为现在程序崩溃了一段时间。它是一个非常小的程序,但在40秒后我达到了超过3GB的ram使用率。

提前致谢! 哈里斯。

代码:

private void Timer()//Timer for color refresh
{
    aTimer = new System.Timers.Timer(300);
    aTimer.Elapsed += new ElapsedEventHandler(Form1_Load);
    aTimer.AutoReset = true;
    aTimer.Enabled = true;
}

private void RefreshColor()//Refreshing the color of selected row
{
    this.Invoke((MethodInvoker)delegate
    {
        if (richTextBox1.SelectionBackColor != Color.PaleTurquoise)
        {
            HighlightCurrentLine();
        }
    });

}

private void Form1_Load(object sender, EventArgs e)
{
    Timer();

    RefreshColor();

1 个答案:

答案 0 :(得分:0)

如果我没有弄错的话,你正在以指数方式创建和启动新的计时器。所以你的表单加载,调用Form1_Load方法。 Form1_Load创建一个新的计时器,当它过去时,将再次调用Form1_Load。由于旧计时器未被处理,2个计时器现在正在运行,这将创建2个新计时器。 4个计时器创建4个新的,所以有8个,16个,32个等...

基本上你要做的就是在计时器上调用其他方法:

if buffer.find("\n") != -1:
    packet = buffer[:buffer.find("\n")]
    buffer = buffer[buffer.find("\n")+1:]

定时器();只被称为一个,因此只创建一个计时器。