实施搜索和突出显示 - 如何在突出显示缓慢时避免延迟?

时间:2013-03-23 14:15:53

标签: c# winforms asynchronous richtextbox

我有一个RichText,并希望实现突出显示搜索,就像您在VS或Chrome中看到的那样。我得到了一个相当有效的实施方案:

private void _txtSearch_TextChanged(object sender, EventArgs e)
{
    new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
}

public void Highlight(string text)
{
    textBox.BeginUpdate();   // Extension, implemented with P/Invoke

    textBox.SelectionStart = 0;
    textBox.SelectionLength = textBox.Text.Length;
    textBox.SelectionBackColor = textBox.BackColor;

    int highlights = 0;

    if (!string.IsNullOrEmpty(text))
    {
    int pos = 0;

    string boxText = textBox.Text;
    while ((pos = boxText.IndexOf(text, pos, StringComparison.OrdinalIgnoreCase)) != -1 && (highlights++) < 500)
    {
        textBox.SelectionStart = pos;
        textBox.SelectionLength = text.Length;

        textBox.SelectionBackColor = Color.Yellow;
        pos += text.Length;
    }
    }

    textBox.EndUpdate();  // Extension, implemented with P/Invoke
}

但是,我想支持大量文本 - 最多2MB。当有大量文本时,每次更新需要250ms。这对于单个搜索来说是可以的 - 但是,我的搜索是增量的,这意味着如果用户输入10个字母的作品,则每个字母出现在250ms之后,这看起来很糟糕。

我使用计时器实现了等待:

private void _txtSearch_TextChanged(object sender, EventArgs e)
{
    performSearch.Stop();
    performSearch.Interval = 100; // Milliseconds
    performSearch.Start();
}

private void performSearch_Tick(object sender, EventArgs e)
{
    new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
    performSearch.Stop();
}

这很有效。但是,当文本很短时,它会减慢增量搜索,这是次优的。我想我可以算上这些字符,但这感觉就像是黑客......

理想情况下,我不想强​​调何时会有额外的击键:

private void _txtSearch_TextChanged(object sender, EventArgs e)
{
    if (!_txtSearch.Magic_are_additional_TextChanged_events_already_queued())
        new RichTextNode(richTextBox1).Highlight(_txtSearch.Text);
}

有办法做到这一点吗?或者计时器解决方案是我能想到的最好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我最终使用了问题中描述的定时器解决方案,延迟时间为1毫秒。