环境:.net 4.0
我的任务是使用 XSLT 样式表转换 XML 文件,这是我的代码
public string TransformFileIntoTempFile(string xsltPath,
string xmlPath)
{
var transform = new MvpXslTransform();
transform.Load(xsltPath, new XsltSettings(true, false),
new XmlUrlResolver());
string tempPath = Path.GetTempFileName();
using (var writer = new StreamWriter(tempPath))
{
using (XmlReader reader = XmlReader.Create(xmlPath))
{
transform.Transform(new XmlInput(reader), null,
new XmlOutput(writer));
}
}
return tempPath;
}
我有 X 个线程可以并行启动这个任务。 有时我的输入文件大约 300 MB,有时只有几 MB。
我的问题:当我的程序尝试同时转换一些大的 XML 文件时,我得到 OutOfMemoryException。
如何避免这些 OutOfMemoryEception?我的想法是在执行任务之前停止一个线程,直到有足够的可用内存,但我不知道该怎么做。或者有其他一些解决方案(比如将我的任务放在一个不同的应用程序中)。
谢谢
最佳答案
我不建议阻塞线程。在最坏的情况下,您最终会饿死可能释放所需内存的任务,从而导致死锁或总体性能非常糟糕。
相反,我建议您保留一个有优先级的工作队列。从线程池中公平调度的队列中获取任务。 确保没有线程在等待操作时阻塞,而是将任务重新发布到队列(具有较低的优先级)。
所以您要做的(例如,在接收到 OutOfMemory 异常时)将相同的作业/任务发布到队列中并终止当前任务,释放线程以执行另一个任务。
一种简单的方法是使用后进先出法,它确保发布到队列中的任务比该队列中已有的任何其他作业具有“较低的优先级”。
关于c# - 停止线程直到有足够的内存可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952928/