我有一个 StringBuilder,它附加图像中的所有像素,这个数量非常大。每次我运行我的程序时,一切都很顺利,但是一旦我更改像素颜色 (ArGB),我就会在我清除 StringBuilder 的地方得到一个 OutOfMemoryException
。 问题是我需要创建一个 StreamWriter
实例,然后将我的文本添加到其中,然后设置文件路径。| 我当前的代码是:
StringBuilder PixelFile = new StringBuilder("", 5000);
Private void Render()
{
//One second run, I get an OutOfMemoryException
PixelFile.Clear();
//This is in a for but cut it out for reverence.
PixelFile.Append(ArGBFormat);
}
我不知道是什么原因造成的。我试过 PixelFile.Length = 0;
和 PixelFile.Capacity = 0;
最佳答案
OutOfMemory 可能意味着您构建的字符串对于 StringBuilder 来说太大了,StringBuilder 旨在处理一种非常不同类型的操作。
虽然我不知道如何让 StringBuilder 工作,但让我为您指出一个更直观的实现,它不太可能失败。
您可以通过 BinaryReader 使用直接二进制文件读取和写入文件和 BinaryWriter类。这也可以为您节省很多精力,因为您可以确保序列化字节而不是字符串或整个单词。
如果你绝对必须使用纯文本,请考虑 StreamReader和 StreamWriter直接类,因为它们不会抛出大小异常。请记住,流是为此类操作而设计的,StringBuilder 不是,因此您可以更轻松地使用流。
编辑:
因此,这是 StringBuilder 类的一个限制,您当前的实现无法克服。
编辑:额外的实现
除了可以直接写入文件的StreamWriters,你还可以使用MemoryStream类将信息通过管道传输到内存而不是磁盘。请注意,这可能会导致程序性能下降,我建议改为尝试重构流程,使其只需要执行一次流。
话虽这么说,但仍有可能。
var mem = new MemoryStream();
var memWriter = new StreamWriter(mem);
// TODO: use memWriter.Write as per StreamWriter
mem.Position = 0; // This ensures you are copying your stream from the beginning
// TODO: Show your file save dialog
var fileStream = new StreamWriter(fileNameFromDialog);
mem.CopyTo(fileWriter); // Perform the copy
关于c# - StringBuilder OutOfMemoryException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587957/