【问题标题】:Remove or Replace Invoke Delegate C#删除或替换调用委托 C#
【发布时间】:2016-06-06 14:28:26
【问题描述】:

首先。我不太擅长这个,希望你无论如何都能理解。 我在我的程序中创建了一个函数,它检查 rtb 中的一行是否突出显示。如果没有,它会突出显示它。 为此,我必须使用不同的线程才能从不同的地方访问 rtb。我的问题是每次计时器刷新时它都会创建一个新的“委托”/实例/线程。我想删除旧线程/委托或用新的替换它。 因为现在程序在一段时间后崩溃了。这是一个非常小的程序,但 40 秒后我的内存使用量超过 3gb。

提前致谢! 哈里斯。

代码:

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();

【问题讨论】:

  • 您的计时器正在触发 Form1_Load 事件,该事件又会启动另一个计时器,依此类推。您只需要一个计时器,就可以摆脱 Invoke 委托。只需启动计时器并每隔 300 毫秒检查一次行的颜色即可。

标签: c# multithreading delegates invoke ram


【解决方案1】:

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

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

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

private void ATimer_Elapsed(object sender, ElapsedEventArgs e)
{
    RefreshColor();
}

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();

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

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多