c# RichTextBox 출력 빠르게 하기

RichTextBox.AppendText는 느리다. 수십 줄 출력하는 데에도 그려지는 게 보일 정도다. 아래의 방법들을 쓰면 빠르게 출력된다.

RichTextBox.BeginUpdate/EndUpdate 만들기

일반적인 비주얼 컨트롤들의 경우 BeginUpdate/EndUpdate가 있다면 이걸 쓰는 게 빠르다. AppendText로 추가되는 내용을 바로바로 출력하는 게 아니라 출력을 멈췄다가 추가할 것들을 다 추가한 뒤 한꺼번에 출력하는 거다. 하지만 RichTextBox에는 BeginUpdate/EndUpdate가 없다. 아래와 같이 상속해서 써야 한다.

public class RichTextBoxInherited : RichTextBox
{
    [DllImport("user32")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

    private const int WM_SETREDRAW = 0x0b;

    public void BeginUpdate()
    {
        SendMessage(Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
    }

    public void EndUpdate()
    {
        SendMessage(Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);

        Invalidate();
    }
}

RichTextBoxInherited RichTextBoxInherited1;

private void Form1_Load(object sender, EventArgs e)
{
    RichTextBoxInherited1 = new()
    {
        Width = 500,
        Height = 500
    };

    Controls.Add(RichTextBoxInherited1);
}

private void Form1_Click(object sender, EventArgs e)
{
    RichTextBoxInherited1.BeginUpdate();

    for (int i = 0; i < 1000; i++)
    {
        RichTextBoxInherited1.AppendText("abcde\n");
    }

    RichTextBoxInherited1.EndUpdate();
}

String.Join 이용하기

더 좋은 방법은 아래와 같다.

StringBuilder stringBuilder = new();

stringBuilder.Append("abcde");

richTextBox1.Text = string.Join('\n', stringBuilder);

스타일을 적용해야 하는 경우에는 RichTextBox.Rtf를 이용하면 된다.