0

一連のレコードの PDF を作成するコンソール アプリケーションを使用しています。カウントが 9000 以上の場合、「ウィンドウ ハンドルの作成中にエラーが発生しました」というエラーが発生しました。アプリケーション レベルでは、6 つのスレッドを使用しています。

タスク マネージャーで観察したように、ハンドルが増加し、ユーザー オブジェクトも増加しています。

オブジェクトを作成した場所に obj.Dispose メソッドを記述しました。だから今私の質問は、ユーザー オブジェクトとハンドルを減らす方法です。

C# で 3.5 Framework のコンソール アプリケーションを使用しています。

アップデート:

以下は私が使用したコードです

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 を開いた場合、File Handler を開くと、管理されていない限られたリソースになります。管理されていないということは、.NET ランタイムがその使用を監視できず、StreamReader オブジェクトへの参照を失ったとしても、ハンドラーが閉じられないことを意味します。そのためには、Dispose 関数を呼び出す必要があります (ネイティブ リソースを使用するクラスを作成する場合は、Dispose 関数を適切に含む IDisposable インターフェイスを実装します)。明示的に呼び出すこともできますが、誰にとっても最善の方法はusingブロックを使用することです。そうすれば、手段が何であれ、ブロックのスコープを離れるたびにハンドラーが適切に閉じられます。

もちろん、開いたままにしてこれほど多くのハンドラーを使用しようとしている場合は、何らかの方法でそれを回避する必要があり、それには現在使用されていないハンドラーを閉じる必要があります。

于 2012-10-03T05:14:50.700 に答える