我正在使用控制台应用程序为一组记录创建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方法的对象。
答案 0 :(得分:1)
从你的问题来看,你在做什么并不是很清楚,但如果我猜对了,你就会保留太多的打开文件处理程序。
所以来吧。例如,如果打开StreamReader,则打开文件处理程序,恰好是非托管且有限的资源。非托管意味着.NET运行时无法密切关注其使用,即使您丢失了对StreamReader对象的引用,也不会关闭处理程序。因此,您需要调用Dispose函数(如果您正在创建一个使用本机资源的类,请实现IDisposable接口,它包含正确的Dispose函数)。您可以明确地进行调用,但最适合每个人的是使用using块。这样,无论何种方式,每次离开块的范围时,处理程序都将正确关闭。
当然,如果你想要保持开放并使用这么多处理程序,你需要以某种方式欺骗它,这仍然会涉及关闭当前使用的那些。