正如评论中所说,您应该尽量避免一次读取整个文件。但是,如果您一次需要整个文件在内存中,我认为您的主要问题可能是程序在读取和转换数据时会遇到的“粘性”。您更明智地使用单独的线程进行十六进制工作,并让主线程专注于保持您的 UI 运行顺畅。无论哪种方式,您也可以使用任务而不是线程。所以使用你的代码片段,让它看起来更像这样:
data[] ... array of byte
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(readHexFile);
t.Start();
}
private void readHexFile()
{
string str = "";
byte[] temp = null;
int i;
for (i = 0; i < (data.Length - 16); i += 16)
{
temp = _sub_array(data, i, 16);
str += BitConverter.ToString(temp).Replace("-", "\t");
str += "\n";
}
temp = _sub_array(data, i, (data.Length - i));
str += BitConverter.ToString(temp).Replace("-", "\t");
BeginInvoke(new Action(()=> richTextBox.Text = str));
}
您需要添加“使用 System.Threading”才能访问线程。还要注意 BeginInvoke 与 richTextBox.Text 在 lambda 表达式中的工作。当您在单独的线程上运行数据处理时,这是必要的,因为如果您尝试使用该线程直接访问文本框,Windows 将抱怨跨线程调用。只有创建控件的线程才被允许直接访问它。BeginInvoke 不直接访问控件,因此您可以从数据处理线程中使用它来获取写入控件的文本。这将阻止数据处理“破坏” UI 响应能力。
如果你从来没有做过,这可能看起来很吓人,但相信我。如果你掌握了线程和任务的窍门(它们在机器内部是不同的,但可以由类似的开发人员工具操作),你将永远不想再次从主线程渲染到 UI。
编辑:我保留了您代码中的字符串,但我同意建议使用 StringBuilder 的评论。字符串是不可变的,所以每次你连接到字符串时,在内部发生的事情是整个字符串被废弃,并且正在使用附加文本创建一个新字符串。所以,是的,也要切换到 StringBuilder 对象。