我有一个棘手的问题,我坚持。我有一些代码只有在循环一定次数的迭代后才会产生问题。代码通过外部PDF打印机程序打印一些PDF文件。前100个左右调用pMgr.SubmitPrint()总是正常工作,但在此之后创建的PDF文件已损坏。
所以我有这个明智的想法,我需要在遇到麻烦之前先从对象的新实例开始。这就是我将代码分成两个循环的原因。在通过'i'循环每20次迭代之后,oApprentice,DrgDoc和pMgr对象超出范围,'j'循环的下一次迭代重新初始化这些对象,所以我应该好好去。这至少是我的假设,但它并不是那样的。在'j'循环的几次迭代之后,我仍然会得到损坏的文件。
但是,如果我在100次调用PDF打印机之前退出并重新启动程序,我可以根据需要打印而不会损坏文件。所以我的问题是,我之前提到的变量是否完全被破坏了? (如果我在调试器中观察它们,它们肯定会超出范围)。退出和重新启动程序有什么不同,而不仅仅是重新初始化变量?
请注意,这些对象都没有实现IDisposable接口,所以我不能使用'using'块。
这是Visual Studio 2012 Express中的winforms c#项目。
有人建议吗?
private void button2_Click(object sender, EventArgs e)
{
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 20; i++)
{
Inventor.ApprenticeServerComponent oApprentice = new ApprenticeServerComponent();
Inventor.ApprenticeServerDrawingDocument drgDoc;
Inventor.ApprenticeDrawingPrintManager pMgr;
drgDoc = (Inventor.ApprenticeServerDrawingDocument)oApprentice.Document;
oApprentice.Open(@"C:\Vault Workspace\Designs\Main\Adapters\Alo Adapter\ADAO600 - ALO\ADAO600 - AO 990\ADAO600 - AO990 - Assemblies.idw");
drgDoc = (Inventor.ApprenticeServerDrawingDocument)oApprentice.Document;
pMgr = (Inventor.ApprenticeDrawingPrintManager)drgDoc.PrintManager;
pMgr.Printer = "Bullzip PDF Printer";
int pageCount = 1;
foreach (Sheet sh in drgDoc.Sheets)
{
if (sh.DrawingViews.Count > 0)
{
switch (sh.Orientation)
{
case PageOrientationTypeEnum.kLandscapePageOrientation:
pMgr.Orientation = PrintOrientationEnum.kLandscapeOrientation;
break;
case PageOrientationTypeEnum.kDefaultPageOrientation:
pMgr.Orientation = PrintOrientationEnum.kDefaultOrientation;
break;
case PageOrientationTypeEnum.kPortraitPageOrientation:
pMgr.Orientation = PrintOrientationEnum.kPortraitOrientation;
break;
}
pMgr.SetSheetRange(pageCount, pageCount);
pMgr.PrintRange = PrintRangeEnum.kPrintSheetRange;
pMgr.ScaleMode = Inventor.PrintScaleModeEnum.kPrintBestFitScale;
pMgr.SubmitPrint();
}
pageCount++;
}
drgDoc.Close();
oApprentice.Close();
}
}
}