删除或替换调用委托 C#
Remove or Replace Invoke Delegate C#
首先。我不太擅长这个,希望你无论如何都能理解。
我在我的程序中创建了一个函数,它检查是否突出显示了 rtb 中的一行。如果没有,它会突出显示它。
为此,我必须使用不同的线程才能从不同的地方访问 rtb。我的问题是每次计时器刷新时它都会创建一个新的 "delegate"/instance/thread。我想删除旧的 thread/delegate 或用新的替换它。
因为现在程序在一段时间后崩溃了。这是一个非常小的程序,但在 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 方法被调用。 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();
计时器();只被称为 ones,因此只创建一个计时器。
首先。我不太擅长这个,希望你无论如何都能理解。 我在我的程序中创建了一个函数,它检查是否突出显示了 rtb 中的一行。如果没有,它会突出显示它。 为此,我必须使用不同的线程才能从不同的地方访问 rtb。我的问题是每次计时器刷新时它都会创建一个新的 "delegate"/instance/thread。我想删除旧的 thread/delegate 或用新的替换它。 因为现在程序在一段时间后崩溃了。这是一个非常小的程序,但在 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 方法被调用。 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();
计时器();只被称为 ones,因此只创建一个计时器。