C# 将大文件加载到RichTextBox时出现性能问题

C# 将大文件加载到RichTextBox时出现性能问题,c#,.net,C#,.net,记事本会在一秒钟内打开一个20000行的文本文件,但当我使用richtextbox1.LoadFile或file.ReadAllText时,加载文件需要几分钟!有什么问题?与其将文件读入数组,然后返回该数组并将每个项目合并为一个字符串,不如使用ReadAllText方法将整个文件内容读入Text属性,该方法返回一个表示文本文件内容的字符串: richTextBox1.Text = File.ReadAllText(path); 然而,结果好坏参半。这两种方法的执行情况类似,ReadLines+

记事本会在一秒钟内打开一个20000行的文本文件,但当我使用richtextbox1.LoadFile或file.ReadAllText时,加载文件需要几分钟!有什么问题?

与其将文件读入数组,然后返回该数组并将每个项目合并为一个字符串,不如使用ReadAllText方法将整个文件内容读入Text属性,该方法返回一个表示文本文件内容的字符串:

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);
    }
}
以毫秒为单位首次执行ReadLines时的结果

ReadAllText = 157
ReadLines + string.Join = 143
ReadLines + string.Join = 160
ReadAllText = 152

如果您正在读取Rtf文件,则应尝试让控件执行该工作。这是从微软关于控件的文档中摘录的,可以在这里找到


如果这不能提高性能,您可能需要通过Lines属性查看异步加载数据。请参见。

您可以提供一个测试代码吗?正如我所知,记事本可以在流中加载文件,例如打开1gb文件,但可以异步加载,您看到的只是文件的第一小部分。它仍然可以加载它几分钟。您是如何衡量性能的?使用StreamReader和StreamWriter,我能够创建一个20000行的文件,并在不到0.5秒的时间内完全读取它。如果您需要几分钟的时间,那么问题很可能是您正在使用的读取文件的方法。请分享一些代码。在投反对票之前,请稍作休息编辑问题。请注意,您的问题不在于阅读文本文件,您的代码示例中的代码注释甚至可以确认您知道这一点。因此,你应该重新命名这个误导性的标题,并写一篇与你的实际问题相关的描述。您的问题显然与读取文本文件无关,但与填充richtextbox有关,因为您的代码注释也相当清楚地承认了这一点。如果您试图回答一个似乎与编程无关的问题,请投赞成票……我刚刚注意到,运行后的应用程序在任务管理器中被UAC禁用。@đěxěŕ谢谢,但是,如何从文件中填充RichTextBox而不是编程呢?坦率地说,这只是其他三位成员投票赞成的共识,老实说,这是一个过于宽泛/固执己见的答案,而且是主观的。你觉得这个问题有建设性吗?@RufusL,因为我认为这不是火箭科学
public void CreateMyRichTextBox()
{
    RichTextBox richTextBox1 = new RichTextBox();
    richTextBox1.Dock = DockStyle.Fill;


    richTextBox1.LoadFile("C:\\MyDocument.rtf");
    richTextBox1.Find("Text", RichTextBoxFinds.MatchCase);

    richTextBox1.SelectionFont = new Font("Verdana", 12, FontStyle.Bold);
    richTextBox1.SelectionColor = Color.Red;

    richTextBox1.SaveFile("C:\\MyDocument.rtf", RichTextBoxStreamType.RichText);

    this.Controls.Add(richTextBox1);
}