C# iTextSharp-非常大的表内存泄漏

C# iTextSharp-非常大的表内存泄漏,c#,pdf-generation,itextsharp,C#,Pdf Generation,Itextsharp,我有一个SqlDataReader读取一个大的记录集(大约1M个记录),我正试图使用iTextSharp将其导出为PDF文档。 这是我的代码: if (reader.HasRows) { int rowNum = 0; while (reader.Read()) { if (rowNum % 2 == 1) datatable.DefaultCell.GrayFill = 0.8f; else dat

我有一个
SqlDataReader
读取一个大的记录集(大约1M个记录),我正试图使用iTextSharp将其导出为PDF文档。 这是我的代码:

 if (reader.HasRows)
 {
    int rowNum = 0;
    while (reader.Read())
    {
       if (rowNum % 2 == 1)
          datatable.DefaultCell.GrayFill = 0.8f;
       else
          datatable.DefaultCell.GrayFill = 0.95f;
       if (meRes.Trans(Lang, "Dir", CompanyID).ToUpper() == "RTL")
          for (int i = reader.FieldCount - 1; i >= 0; i--)
          {
             object o = reader[i];
             datatable.AddCell(new Phrase(o.ToString(), fntList));
          }
       else
          for (int i = 0; i < reader.FieldCount; i++)
             {
                object o = reader[i];
                datatable.AddCell(new Phrase(o.ToString(), fntList));
             }
       rowNum++;
   }
    myDocument.Add(datatable);
 }
if(reader.HasRows)
{
int rowNum=0;
while(reader.Read())
{
如果(行数%2==1)
datatable.DefaultCell.GrayFill=0.8f;
其他的
datatable.DefaultCell.GrayFill=0.95f;
if(meRes.Trans(Lang,“Dir”,CompanyID).ToUpper()=“RTL”)
对于(int i=reader.FieldCount-1;i>=0;i--)
{
对象o=读取器[i];
AddCell(新短语(o.ToString(),fntList));
}
其他的
对于(int i=0;i
当我运行此程序时,它会导致严重的内存泄漏。
我可以做些什么来改进这一点?

您可以设置每页的行数以减少内存压力

if (rowNum>0 && table1.Rows.Count % 7 == 0) // 7 = number of rows per page
{
   pdfDoc.Add(table1);
   table1.DeleteBodyRows(); // free resources
   pdfDoc.NewPage();
}

在条件中为每个循环创建一个对象,如
objecto=reader[i]。这可能是问题所在,我不认为这是问题所在,因为如果我在做
datatable.AddCell(新短语(reader[I],fntList))它仍然会导致内存泄漏。当您将数据导出到datatable中时,datatable是数据的内存表示形式。直到您的mydocument.Add(datatable)在内存中积累所有内容。“没有泄漏,只是一个糟糕的设计。谢谢@mkl,你建议我应该做些什么来改进它?”瓦希登同时建议了一种方法。更多详细信息可以从iText in Action,第二版以及在线提供的示例中获得。谢谢,听起来不错,但是有没有办法知道在添加表格后,同一页中还剩下多少空间以防止出现大的空白?在pdfDoc.add(table1)之后,您将可以访问表格的高度值。将其从页面大小和边距中缩小,以计算空白空间的高度。