如何减少控制台应用程序的用户对象和句柄

时间:2012-10-03 04:54:33

标签: c# windows-console

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

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

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

我在C#中使用3.5 Framework的控制台应用程序。

更新

以下是我使用的代码

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

FirstTreadPDFs.Start();

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

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

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

// Thread5 Thread 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方法的对象。

1 个答案:

答案 0 :(得分:1)

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

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

当然,如果你想要保持开放并使用这么多处理程序,你需要以某种方式欺骗它,这仍然会涉及关闭当前使用的那些。