请教一个资源释放、垃圾回收问题
下面的代码很简单,就是使用Spire.Pdf给pdf文件加一个字符串:首先检查是否已加,若未加则添加字符串并将结果保存到数据库。
运行时内存会慢慢耗尽、导致程序退出。我加了Dispose()或GC.Collect()仍没有用。(问题不会出现在DBHelper,这个类一直使用没有异常的)
请问应该如何修改?谢谢!
运行时内存会慢慢耗尽、导致程序退出。我加了Dispose()或GC.Collect()仍没有用。(问题不会出现在DBHelper,这个类一直使用没有异常的)
请问应该如何修改?谢谢!
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace AddWaterMark
{
class Program
{
private static readonly string connectionString = "";
private static readonly string workPath = @"";
static void Main(string[] args)
{
PdfDocument document = new PdfDocument();
string jobName;
DataRow[] rows;
string sql = "SELECT filename FROM WaterMark";
DataTable dataTable = DBHelper.ExecuteDataTable(connectionString, CommandType.Text, sql, null);
var dicFileList = GetFiles(workPath);
foreach (KeyValuePair<string, string> kv in dicFileList)
{
//如果数据库中不存在此条记录则表示未添加
rows = dataTable.Select("filename='" + kv.Key + "'");
if (rows.Length == 0)
{
try
{
jobName = kv.Key;
//添加水印
document.LoadFromFile(jobName);
if (!AddMarkSuccessed(document, jobName))
continue;
document.SaveToFile(destFile);
document.Dispose();
//添加成功后保存到数据库中
sql = $@"INSERT INTO WaterMark(filename,updatetime) VALUES ('{jobName}','{DateTime.Now}')";
DBHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, null);
}
catch (Exception)
{
}
}
}
}
private static bool AddMarkSuccessed(PdfDocument doc, string jobName)
{
try
{
float x = 160;
float y = 10;
for (int i = 0; i < doc.Pages.Count; i++)
{
//删除旧的图层
doc.Pages[i].PageLayers.DeleteOldLayer("WaterMark");
//添加新的图层
PdfFont font = new PdfFont(PdfFontFamily.TimesRoman, 30f, PdfFontStyle.Italic | PdfFontStyle.Bold);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Center);
PdfPageLayer layer = doc.Pages[i].PageLayers.Add("WaterMark", true);
layer.Graphics.SetTransparency(0.3f);
layer.Graphics.DrawString(jobName, font, PdfBrushes.Red, x, y, format);
}
return true;
}
catch (Exception)
{
return false;
}
}
}
}
...全文



