【问题标题】:c# - Richtextbox.text throws stackoverflow exception adding lines by eventc# - Richtextbox.text 抛出 stackoverflow 异常,按事件添加行
【发布时间】:2016-05-03 20:26:57
【问题描述】:

我正在通过事件将行附加到 RickTextbox,我正在使用此代码。

  private void Process(object sender, DataReceivedEventArgs e)
    {
        if (richTextBox1.InvokeRequired)
        {
            BeginInvoke(new Mesage(Process), sender, e);
        }
        else
        {
            richTextBox1.Text += e.Data + Environment.NewLine;

            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();

            Application.DoEvents();
        }
    }

我正在尝试向 C# WinForms 中的 RichTextbox 添加新行,但它会在该行中引发 StackOverflow 异常。

 richTextBox1.Text += e.Data + Environment.NewLine;

e.Data 是一个字符串。我应该怎么做才能继续添加行?

编辑

该进程链接到 fluentmigrator 进程,返回许多行,因为它正在对数据库运行查询。

【问题讨论】:

  • 明确地说,它不会返回堆栈溢出异常,它抛出堆栈溢出异常。这是一个重要的区别。
  • Process函数附加到哪个事件上?
  • 大多数时候,如果你有某种无限递归循环,就会发生堆栈溢出异常。我得检查一下BeginInvoke() 又做了什么,但BeginInvoke(new Mesage(Process), sender, e); 看起来可能是罪魁祸首。
  • 将代码放在 try...catch 中,这样您就可以看到发生了什么。
  • 我认为 phoog 是正确的。什么样的事件调用函数?我的朋友经常犯错误,为此使用 textBox_TextChanged 事件。

标签: c# .net winforms event-handling richtextbox


【解决方案1】:

经过一些研究和测试,我更改了代码以减少对函数的调用次数。 Process 方法在如此短的时间内被调用了很多次,从而引发了异常。更改后不再出现错误。

private void Process(object sender, DataReceivedEventArgs e){
if (richTextBox1.InvokeRequired)
{
    invoked = true;
    BeginInvoke(new Mensagem(ProcessaMensagem), sender, e);
}
else
{
    try
    {       
        commands.Add(e.Data);
        count++;
        if (count % 5 == 0)
        {
            richTextBox1.Lines = commands.ToArray();
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.ScrollToCaret();

            Application.DoEvents();             
        }       
    }
    catch (Exception ex)
    {
        //log logic
    }
}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多