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();