c#变量范围和初始化问题

时间:2014-09-26 17:25:22

标签: c# printing

我有一个棘手的问题,我坚持。我有一些代码只有在循环一定次数的迭代后才会产生问题。代码通过外部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();
            }
        }
    }

0 个答案:

没有答案