C#程序内存不足

C#程序内存不足,c#,object,out-of-memory,C#,Object,Out Of Memory,我有一个程序内存不足。我不明白为什么当我设置object=null时,它已经被“处理”了 我收到以下错误:mscorlib.dll中出现System.OutOfMemoryException 在运行程序和观察taskmanager时,我可以看到内存消耗随着代码的迭代次数线性增加 我应该如何制作一个不会增加内存消耗/转储的程序 CL_Batch: class CL_Batch { private string BatchAID; private strin

我有一个程序内存不足。我不明白为什么当我设置
object=null时,它已经被“处理”了

我收到以下错误:mscorlib.dll中出现System.OutOfMemoryException 在运行程序和观察taskmanager时,我可以看到内存消耗随着代码的迭代次数线性增加

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

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 "";
        }
}
那么真正的区别是什么呢? 如果要以不同的方式添加两个数字,那么最终将得到相同的指令

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

Second program:
xor ax, ax
mov ax, 10
add ax, 10
在我看来,最终没有什么不同(我发现我误用了oop的概念,但最终产品是一样的——我希望如此)

关于我的错觉,请给我一些建议

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

这是一种暗中操作,因为我们看不到您的代码。您正在创建PDF。这通常涉及某种COM对象或内存流。也许你用来创建这些PDF的任何东西都不会被处理或清理,所以你创建的每一个PDF都会保存在内存中,直到用完为止。我将仔细查看您正在使用的任何组件的文档。如果某个东西实现了IDisposable
请确保您正在处理它。

尽管我不同意关于坏构造函数代码的建议,但我必须承认它起了作用,并且在从构造函数中删除代码后,代码按预期工作。 如果有人能给我一个很好的解释,那么我想听听。 有什么我可以给你们的吗, 卡勒姆·林林顿, 混合剑突, 马诺德斯特拉, 迈克·罗宾逊, 马修·怀特, 斯科特·汉南(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();

什么是CL_批处理?将代码片段缩减为一个
foreach
并不是一种减少噪音的方法-如果你只是在整个类中减少噪音并向我们展示这个缩减的类会更好-你永远不知道它可能不在你的foreach循环中什么是CL_批处理的构造函数?为什么要为刚创建的对象设置空值?这闻起来像是一个被滥用的构造函数。我们仍然缺少相关的代码。构造函数正在调用未包含的方法。问题可能是任何东西。但在构造函数中不应该有“做某事”的行为。很明显,您这样做是因为您正在创建对象,然后将其设置为null,这表明仅仅创建对象就会导致某些事情发生。我们应该创建一个对象,然后对该对象执行一些操作。构造函数本身不应该位于类的行为所在的位置。请务必学习面向对象编程的基础知识。构造函数应该用于构造对象,而不是执行所有类型的代码。这不仅使您创建的对象变得无用,还使它无法用于其他用例。这不是一个答案。你应该删除这个。而且,您仍然在数据循环中进行所有处理。最后不需要Batch=null行。每次迭代只实例化一次,而且无论如何都会重新实例化,所以将其设置为null是毫无意义的。问题在于后续的方法。我不会做你在这里做的事。我会在这个循环之外的另一个循环中进行处理,但至少现在您可以更好地识别内存泄漏发生的位置,因为您已经稍微打破了逻辑。@manodestress谢谢您的回复。关于程序,那么内存消耗会按照预期的那样上下移动-现在。关于在数据循环内处理的语句。如果不是这样,我该怎么做?提前谢谢。请对我温柔一点。我在这里挨打。有两种方法。这里的方法更好,因为您应该更好地了解内存消耗导致程序崩溃的原因。从那里,你可以深入了解原因。就我个人而言,我会将所有这些方法调用(.setRefnbr()、setIDTypes()等)移动到第二个循环。因此,如上所述,循环遍历表中的行,但将每个CL_批添加到列表中。然后在此循环之后循环该列表,并在那里执行方法调用。有意义吗?我礼貌地不同意,马诺德斯特拉:这是一个“答案”,因为它结束了这个话题:“这,作为记录,是我如何解决这个问题的。”是的,你可以在原来的帖子中添加同样的内容。但是,我肯定喜欢看到一条线索(在任何论坛上,任何地方),“结束”。它反映了:最初的困惑,导致解决方案的讨论,以及解决方案。是的,我仍然希望看到解决方案。我还是想知道问题出在哪里。而且仍然值得将您的连接实例化包装为using,而不是显式的闭包:)
First program:
xor ax, ax
mov ax, 10
add ax, 10

Second program:
xor ax, ax
mov ax, 10
add ax, 10
 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();