Как уменьшить пользовательские объекты и дескрипторы для консольного приложения

У меня есть консольное приложение, которое создает PDF для набора записей. Ибо, если количество превышает 9000, возникает ошибка «Ошибка создания дескриптора окна». На уровне приложения я использую 6 потоков.

Как я заметил в диспетчере задач, дескрипторы увеличиваются, и пользовательские объекты также увеличиваются.

Я написал метод obj.Dispose, где бы я ни создавал объект. Итак, теперь мой вопрос заключается в том, как уменьшить количество пользовательских объектов и дескрипторов.

Я использую консольное приложение с 3.5 Framework на С#.

Обновлять:

Ниже приведен код, который я использовал

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

FirstTreadPDFs.Start();

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

//Thread3 Thread ThirdTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess2()); ТретийTreadPDFs.Start();

//Thread4 Thread FourthTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess()); ЧетвертыйTreadPDFs.Start();

//Thread5 Thread FifthTreadPDFs = new Thread(() => objPDFsProcess.DoGeneratePDFsProcess1()); ПятыйTreadPDFs.Start();

FirstTreadPDFs.Join(); SecondTreadPDFs.Join(); ThirdTreadPDFs.Join(); ЧетвертыйTreadPDFs.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.


person Vara Prasad.M    schedule 03.10.2012    source источник


Ответы (1)


Из вашего вопроса не совсем понятно, что вы делаете, но, если я правильно понимаю, вы держите слишком много обработчиков открытых файлов.

Итак, вот оно. Например, если вы открываете StreamReader, вы открываете обработчик файлов, который оказывается неуправляемым и ограниченным ресурсом. Неуправляемый означает, что среда выполнения .NET не может следить за своим использованием, и даже если вы потеряете ссылку на объект StreamReader, обработчик не будет закрыт. Итак, для этого вам нужно вызвать функцию Dispose (и если вы создаете класс, который использует собственные ресурсы, реализуйте интерфейс IDisposable, который правильно содержит функцию Dispose). Вы можете сделать вызов явно, но лучше всего использовать using блок. Таким образом, ваши обработчики будут правильно закрываться каждый раз, когда вы покидаете область действия блока, какими бы ни были средства.

Конечно, если вы пытаетесь сохранить открытым и использовать столько обработчиков, вам нужно как-то обойти это, и это все равно будет включать закрытие неиспользуемых в настоящее время.

person Robert    schedule 03.10.2012