2012-10-03 34 views
0

我正在創建一組記錄的PDF控制檯應用程序。如果計數超過9000,則會發生「創建窗口句柄錯誤」錯誤。在應用程序級別,我使用6個線程。如何減少控制檯應用程序的用戶對象和句柄

正如我在任務管理器中觀察到的句柄越來越多,用戶對象也在增加。

我已經寫了obj.Dispose方法,我曾經創建過這個對象。所以現在我的問題是如何減少用戶對象和句柄。

我在C#中使用3.5框架的控制檯應用程序。

更新:

下面是我已經使用

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

FirstTreadPDFs.Start()的代碼;

// Thread2 Thread SecondTreadPDFs = new Thread(()=> objPDFsProcess.DoGeneratePDFsProcess()); SecondTreadPDFs.Start(); ()=> 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+條記錄後,退出嘗試行正在執行並停止應用程序。

哪裏我使用的對象我放置Dispose方法。

+0

請告訴我們你的代碼... –

回答

1

從你的問題來看,你不太清楚你在做什麼,但是如果我猜對了,你會保留太多的開放文件處理程序。

所以它來了。例如,如果您打開一個StreamReader,則會打開一個文件處理程序,這是一個非託管且有限的資源。非託管意味着.NET運行時無法保留其使用標籤,即使您失去對StreamReader對象的引用,處理程序也不會關閉。因此,您需要調用Dispose函數(並且如果要創建使用本機資源的類,請實現IDisposable接口,其中包含Dispose函數)。您可以明確地進行呼叫,但對每個人來說最好的方法是使用using區塊。這樣,無論您採取什麼措施,每當您離開街區範圍時,您的搬運工都會正常關閉。

當然,如果你是triing保持開放,並使用這麼多的處理程序,你需要以某種方式欺騙周圍的方式,這將仍然涉及關閉當前未使用的。

相關問題