首页 > 解决方案 > 将大文件加载到 RichTextBox 时的性能问题

问题描述

记事本会在一秒钟内打开一个文本文件(有 20,000 行),但是当我使用richtextbox1.LoadFile()File.ReadAllText()加载文件时需要几分钟!怎么了?

标签: c#.net

解决方案


无需将文件读入一个数组,然后返回该数组并将每个项目连接成一个字符串,只需Text使用该方法将整个文件内容读入属性,该ReadAllText方法返回一个表示文本文件内容的字符串:

richTextBox1.Text = File.ReadAllText(path);

然而,结果好坏参半。两种方法的执行方式相似,ReadLines+string.Join花费的时间往往更少。

这是我的测试应用程序:

public partial class Form1 : Form
{
    private const string FilePath = @"f:\private\temp\temp.txt";

    public Form1()
    {
        InitializeComponent();

        // Create a file with 20,000 lines
        var fileLines = new List<string>(20000);

        for (int i = 0; i < 20000; i++)
        {
            fileLines.Add($"This is line number {i + 1}.");
        }

        File.WriteAllLines(FilePath, fileLines);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Test loading with ReadAllText
        richTextBox1.Text = string.Empty;

        var sw = Stopwatch.StartNew();
        richTextBox1.Text = File.ReadAllText(FilePath);
        sw.Stop();

        Debug.WriteLine("ReadAllText = " + sw.ElapsedMilliseconds);
    }


    private void button2_Click(object sender, EventArgs e)
    {
        // Test loading with ReadLines and string.Join
        richTextBox1.Text = string.Empty;

        var sw = Stopwatch.StartNew();
        List<string> lines = new List<string>();
        lines.AddRange(File.ReadAllLines(FilePath));         
        richTextBox1.Text = string.Join(Environment.NewLine, lines);
        sw.Stop();

        Debug.WriteLine("ReadLines + string.Join = " + sw.ElapsedMilliseconds);
    }
}

第一次执行时的结果ReadAllText(以毫秒为单位)

ReadAllText = 157
ReadLines + string.Join = 143

第一次执行时的结果ReadLines(以毫秒为单位)

ReadLines + string.Join = 160
ReadAllText = 152

推荐阅读