c# - 停止线程直到有足够的内存可用

标签 c# xml out-of-memory

环境:.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/

相关文章:

c - 在这个程序中数组是如何存储在内存中的?

c# - 通用 Windows 应用上的 ViewModel (MVVM) 绑定(bind)页面

c# - 如何测试方法是否返回预期的数据类型?

Java 信使 : save message archives on the computer

android - 使用 inSampleSize <2 或以其他方式调整位图大小而不会遇到 OoM

c++ - mlpack : out of memory error

c# - 从 C# 代码调用 Tomcat 服务器

c# - System.Environment.UserName 可以轻易伪造吗?

java - 使用 xPath 修改 XML 文件

c# - Xml InnerXml 缩进问题