添加到文本框的大字符串冻结了我的程序
Large strings added to a text box freezing my program
此程序将文件打开到文本框中。它适用于大小为 4KB 的小文件,但我无法处理 200KB 的文件。理想情况下,我希望能够打开任何大小的文件,但将大文件打开到文本框中会冻结程序。我做错了什么?
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
textBox1.Text = String.Empty;
while (!sr.EndOfStream)
{
textBox1.Text += sr.ReadLine() + Environment.NewLine;
}
sr.Close();
}
openFileDialog1.Dispose();
}
逐行读取文件会产生不必要的开销。最好一次读取所有文件。
考虑使用 async/await。这将为您带来更灵敏的界面。
所以我建议下一个解决方案:
private async void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
textBox1.Text = await sr.ReadToEndAsync();
sr.Close();
}
openFileDialog1.Dispose();
}
编辑
如评论中所述,此解决方案无法正确处理 unix 风格的换行符。对于这种情况,它可以是其他决定:
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
var sb = new StringBuilder();
while (!sr.EndOfStream)
{
sb.AppendLine(sr.ReadLine());
}
textBox1.Text = sb.ToString();
sr.Close();
}
openFileDialog1.Dispose();
}
现在我们使用的是StringBuilder,它专为快速处理字符串数据而设计。
此程序将文件打开到文本框中。它适用于大小为 4KB 的小文件,但我无法处理 200KB 的文件。理想情况下,我希望能够打开任何大小的文件,但将大文件打开到文本框中会冻结程序。我做错了什么?
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
textBox1.Text = String.Empty;
while (!sr.EndOfStream)
{
textBox1.Text += sr.ReadLine() + Environment.NewLine;
}
sr.Close();
}
openFileDialog1.Dispose();
}
逐行读取文件会产生不必要的开销。最好一次读取所有文件。
考虑使用 async/await。这将为您带来更灵敏的界面。
所以我建议下一个解决方案:
private async void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
textBox1.Text = await sr.ReadToEndAsync();
sr.Close();
}
openFileDialog1.Dispose();
}
编辑
如评论中所述,此解决方案无法正确处理 unix 风格的换行符。对于这种情况,它可以是其他决定:
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
Text = openFileDialog1.FileName + " - " + "Fixprt";
var sb = new StringBuilder();
while (!sr.EndOfStream)
{
sb.AppendLine(sr.ReadLine());
}
textBox1.Text = sb.ToString();
sr.Close();
}
openFileDialog1.Dispose();
}
现在我们使用的是StringBuilder,它专为快速处理字符串数据而设计。