C#程序内存不足

时间:2016-06-27 13:40:14

标签: c# object out-of-memory

我有一个耗尽内存的程序。我不明白为什么我设置object = null时已经处理了#34;

foreach (DataRow theRow in thisDataSet.Tables["Collection"].Rows)
{
    LS_BatchAID = Convert.ToString(theRow["BatchAID"]);
    LS_Batch = Convert.ToString(theRow["Batch"]);
    LS_ID = Convert.ToString(theRow["ID"]);
    CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch);
    Batch = null;
}

thisConnection.Close();

我收到此错误:System.OutOfMemoryException'发生在mscorlib.dll中 在运行程序和观察任务管理器时,我可以根据代码的迭代次数来观察内存消耗的线性上升。

我应该如何制作一个不会增加内存消耗/转储的程序?

CL_Batch:

class CL_Batch
    {
        private string BatchAID;
        private string ID;
        private string Batch;
        private string pathPDF;
        private string pathCPR;
        private string pathLog;
        private string DateXMLGenerated;

        private string[] IDType; 
        private string[,] IDTypes;
        private string[] Files;
        private DateTime Dates;
        private byte[] pdfContent;
        private string XMLContent;
        private string[] RefNbr;

        public CL_Batch(string IV_BatchAID, string IV_ID, string IV_Batch)
        {
            this.Dates = DateTime.Now;

            this.DatoXMLGenerated = "" + Dato.Date.Year.ToString() + "-" + BuildNumber(true, 2, Dato.Date.Month.ToString()) + "-" + BuildNumber(true, 2, Dato.Date.Day.ToString()) + "";
            this.BatchAID = IV_BatchAID;
            this.ID = IV_ID;
            this.Batch = IV_Batch;
            this.pathPDF = @"C:\path\TempFiles\path\" + this.ID + ".Pdf";
            this.pathCPR = @"C:\path\TempFiles\";
            this.pathLog = @"C:\path\Log\" + this.Batch + ".txt";

            setRefnbr();

                // Set array with mappings of ID between partners.
                setLegitimationsTyper();

                // ensure log is available ( [NameOfLog] ).
                prepareLog();

                // Find all files for archive.
                getFileNames();

                // Move files C:\path\TempFiles\
                if (this.getFiles() == true)
                {
                    // Create PDF's. 
                    makePDF();

                    // Insert PDF's in database.
                    insertPDF();

                    // Create XML files.
                    makeXML();

                    // Insertt XML in database.
                    insertXML();

                }



        public string getBatchAID()
        {
            return this.BatchAID;
        }

        public string getID()
        {
            return this.ID;
        }

        public string getBatch()
        {
            return this.Batch;
        }

        public string getIDTyper(string IV_Code, bool kode)
        {

            for (int i = 0; i <= this.IDTypes.GetUpperBound(0); i++)
            {
                if (this.IDTypes[i, 0] == IV_Kode)
                {
                    if (Code == true)
                    {
                        return this.LegitimationsTyper[i, 1];
                    }
                    else
                    {
                        return this.LegitimationsTyper[i, 2];
                    }
                }
            }
            return "";
        }
}

/ *********** /

/ **更新#1 ************************** /

足够公平!滥用构造函数。我明白了 - 但是: 真的是什么问题?

如果我这样做,就像我已经做过的那样:

CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch);

Batch.setRefnbr();
Batch.setIDTypes();
Batch.prepareLog();
Batch.getFileNames();
Batch.makePDF();
Batch.insertPDF();
Batch.makeXML();
Batch.insertXML();
Batch = null;

然后真正的区别是什么? 如果以不同的方式添加几个数字,那么最终会得到相同的指令。

First program:
xor ax, ax
mov ax, 10
add ax, 10

Second program:
xor ax, ax
mov ax, 10
add ax, 10

我看到它的方式最终没有区别(我认为我滥用oop的概念,但最终产品是相同的 - 我期待)

关于我的妄想,请告诉我。

提前致谢。 / **更新#1 / / ****************************************** /

2 个答案:

答案 0 :(得分:3)

由于我们无法看到您的代码,因此这是一个黑暗中的刺伤。你正在创建PDF。这通常涉及某种COM对象或内存流。也许用于创建这些PDF的任何内容都不会被处理或清理,因此您创建的每个PDF都会存放在内存中,直到您用完为止。我会仔细查看您正在使用的任何组件的文档。如果某些内容实现IDisposable,请确保您正在处理它。

答案 1 :(得分:0)

尽管我不同意有关错误构造函数代码的提议,但我必须承认它有所不同,并且在从构造函数中删除代码后代码按预期工作。 如果有人对我有一个很好的解释,那么我想听听。 无论如何我可以给你们(BugFinder, Callum Linington, Mixxiphoid, ManoDestra, 迈克罗宾逊, 马修怀特, Scott Hannen)对解决方案的信任?

这是有效的代码:

 foreach (DataRow theRow in thisDataSet.Tables["Collection"].Rows)
 {
  LS_BatchAID = Convert.ToString(theRow["BatchAID"]);
  LS_Batch = Convert.ToString(theRow["Batch"]);
  LS_ID = Convert.ToString(theRow["ID"]);
  CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch);
  Batch.setRefnbr();
  Batch.setIDTypes();
  Batch.prepareLog();
  Batch.getFileNames();
  Batch.makePDF();
  Batch.insertPDF();
  Batch.makeXML();
  Batch.insertXML();
 }
 thisConnection.Close();