0

我有为一组记录创建 PDF 的控制台应用程序。如果计数为 9000 以上,则会发生“创建窗口句柄时出错”的错误。在应用程序级别我使用 6 个线程。

正如我在任务管理器中观察到的,句柄在增加,用户对象也在增加。

我已经在创建对象的地方编写了 obj.Dispose 方法。所以现在我的问题是如何减少用户对象和句柄。

我在 C# 中使用带有 3.5 框架的控制台应用程序。

更新:

下面是我用过的代码

Thread FirstTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess());

FirstTreadPDFs.Start();

//Thread2 线程 SecondTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess()); SecondTreadPDFs.Start();

//Thread3 线程 ThirdTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess2()); ThirdTreadPDFs.Start();

//Thread4 线程FourthTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess()); FourthTreadPDFs.Start();

//Thread5 线程 FifthTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess1()); FifthTreadPDFs.Start();

FirstTreadPDFs.Join(); SecondTreadPDFs.Join(); ThirdTreadPDFs.Join(); FourthTreadPDFs.Join(); FifthTreadPDFs.Join();

 DataSet dsHeader1 = new DataSet();
                        //Pending Cusotmers need to get to generate PDFs
                        dsHeader1 = objCustStatementDAL.GetCustStatementdetailsForPDF(IsEDelivery, 1);

                        if (dsHeader1 != null && dsHeader1.Tables.Count > 0)
                        {
                            if (dsHeader1.Tables[0].Rows.Count > 0)
                            {
                                writerLog.WriteLine(DateTime.Now + " Trying to get Pending Records");
                                objPDFsProcess.DoGeneratePDFsProcess2();
                                writerLog.WriteLine(DateTime.Now + " Exit Trying to get Pending Records block");
                            }
                        }
                        dsHeader1.Dispose();

在执行 9000+ 条记录后,Exit Trying 行正在执行并停止应用程序。

我在哪里使用我放置的对象 Dispose 方法。

4

1 回答 1

1

从您的问题来看,您并不清楚您在做什么,但如果我猜对了,您保留了太多打开的文件处理程序。

所以它来了。例如,如果您打开一个 StreamReader,您打开一个文件处理程序,这恰好是一个非托管和有限的资源。非托管意味着 .NET 运行时无法密切关注其使用情况,即使您失去对 StreamReader 对象的引用,处理程序也不会关闭。因此,您需要调用 Dispose 函数(如果您正在创建一个使用本机资源的类,请实现 IDisposable 接口,该接口正确包含 Dispose 函数)。您可以显式进行调用,但对每个人来说最好的方法是使用using块。这样,您的处理程序将在您每次离开块范围时正确关闭,无论以何种方式。

当然,如果您试图保持开放并使用这么多处理程序,您需要以某种方式绕过它,这仍然涉及关闭当前未使用的处理程序。

于 2012-10-03T05:14:50.700 回答