【发布时间】:2021-05-20 06:34:17
【问题描述】:
我的这段代码在我的机器上运行良好,但在另一台机器上抛出了System.OutOfMemoryException。我只是想初始化MemoryStream 对象,然后在其中写入xDoc 的内容。
xDoc 是一个数据类型为 XDocument 的对象,在我的机器上我可以看到用 xDoc 的内容写入的流的长度是 58070847。
MemoryStream stream = new MemoryStream();
xDoc.Save(stream);
stream.Position = 0;
using (var sr = new StreamReader(stream))
{
strXml = sr.ReadToEnd();
}
System.OutOfMemoryException 这里有几个问题,但他们没有回答我的问题。
我尝试过的事情:
-
MemoryStream的所有constructors。 -
MemoryStream 流 = new MemoryStream(); 线程.睡眠(4000); //添加这个是因为最后一点。 xDoc.Save(流); 流.位置 = 0; 使用 (var sr = new StreamReader(stream)) { strXml = sr.ReadToEnd(); }
以上都不起作用,但奇怪的是下面的代码起作用了,我想知道如何。
MemoryStream stream = new MemoryStream();
MessageBox.Show("Loading data"); //Added this for reference while testing and strangely doesn't throw any error!!
xDoc.Save(stream);
stream.Position = 0;
using (var sr = new StreamReader(stream))
{
strXml = sr.ReadToEnd();
}
我想了解为什么添加 MessageBox 语句有效
谢谢
【问题讨论】:
-
在哪里抛出异常?在
Save或ReadToEnd? -
目前还不清楚为什么
MemoryStream会在这里涉及到,而您应该可以只做strXml = xDoc.ToString()? -
@Damien_The_Unbeliever 我知道这可以通过您建议的简单行来完成,但我更感兴趣的是我在给定的代码中做错了什么,以便我更好地理解 C#。
-
@JonSkeet In
Save -
人们为什么要这样做?有谁会认为将 60 MB 的 XML 投入到一段代码中是可以的?您的代码将需要在连续内存中的倍数来保存字符串、内存流中的字节数组等。您可能正在作为 32 位进程运行。解决办法不是切换到 64 位,而是给发给你这个 XML 的人一巴掌。
标签: c# memory out-of-memory messagebox