2016-06-27 16 views
-5

プログラムが不足しています。 object = nullが「処理された」と設定した理由は分かりません。C#プログラムが不足しています

foreach (DataRow theRow in thisDataSet.Tables["Collection"].Rows) 
{ 
    LS_BatchAID = Convert.ToString(theRow["BatchAID"]); 
    LS_Batch = Convert.ToString(theRow["Batch"]); 
    LS_ID = Convert.ToString(theRow["ID"]); 
    CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch); 
    Batch = null; 
} 

thisConnection.Close(); 

私はこのエラーを取得:プログラムを実行し、タスクマネージャを見ながらSystem.OutOfMemoryExceptionには」がmscorlib.dll で発生した、私はコードの反復回数に対応して直線的にメモリ消費の上昇を見ることができます。

は、どのように私はダンプ/メモリ消費量を増加させないプログラムを作成することが出来るのですか?

CL_Batch: 

class CL_Batch 
    { 
     private string BatchAID; 
     private string ID; 
     private string Batch; 
     private string pathPDF; 
     private string pathCPR; 
     private string pathLog; 
     private string DateXMLGenerated; 

     private string[] IDType; 
     private string[,] IDTypes; 
     private string[] Files; 
     private DateTime Dates; 
     private byte[] pdfContent; 
     private string XMLContent; 
     private string[] RefNbr; 

     public CL_Batch(string IV_BatchAID, string IV_ID, string IV_Batch) 
     { 
      this.Dates = DateTime.Now; 

      this.DatoXMLGenerated = "" + Dato.Date.Year.ToString() + "-" + BuildNumber(true, 2, Dato.Date.Month.ToString()) + "-" + BuildNumber(true, 2, Dato.Date.Day.ToString()) + ""; 
      this.BatchAID = IV_BatchAID; 
      this.ID = IV_ID; 
      this.Batch = IV_Batch; 
      this.pathPDF = @"C:\path\TempFiles\path\" + this.ID + ".Pdf"; 
      this.pathCPR = @"C:\path\TempFiles\"; 
      this.pathLog = @"C:\path\Log\" + this.Batch + ".txt"; 

      setRefnbr(); 

       // Set array with mappings of ID between partners. 
       setLegitimationsTyper(); 

       // ensure log is available ([NameOfLog]). 
       prepareLog(); 

       // Find all files for archive. 
       getFileNames(); 

       // Move files C:\path\TempFiles\ 
       if (this.getFiles() == true) 
       { 
        // Create PDF's. 
        makePDF(); 

        // Insert PDF's in database. 
        insertPDF(); 

        // Create XML files. 
        makeXML(); 

        // Insertt XML in database. 
        insertXML(); 

       } 



     public string getBatchAID() 
     { 
      return this.BatchAID; 
     } 

     public string getID() 
     { 
      return this.ID; 
     } 

     public string getBatch() 
     { 
      return this.Batch; 
     } 

     public string getIDTyper(string IV_Code, bool kode) 
     { 

      for (int i = 0; i <= this.IDTypes.GetUpperBound(0); i++) 
      { 
       if (this.IDTypes[i, 0] == IV_Kode) 
       { 
        if (Code == true) 
        { 
         return this.LegitimationsTyper[i, 1]; 
        } 
        else 
        { 
         return this.LegitimationsTyper[i, 2]; 
        } 
       } 
      } 
      return ""; 
     } 
} 

/******************************************/

/** UPDATE#1 **************************/

十分フェア!コンストラクタの誤用。私はポイントを得る - しかし、: 本当に問題は何ですか?

私はすでにこの例に対して行っているように私が行う場合:

CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch); 

Batch.setRefnbr(); 
Batch.setIDTypes(); 
Batch.prepareLog(); 
Batch.getFileNames(); 
Batch.makePDF(); 
Batch.insertPDF(); 
Batch.makeXML(); 
Batch.insertXML(); 
Batch = null; 

その後、本当の違いは何ですか? 2つの数字を追加する方法が異なる場合は、同じ手順で終了します。

First program: 
xor ax, ax 
mov ax, 10 
add ax, 10 

Second program: 
xor ax, ax 
mov ax, 10 
add ax, 10 

私はそれを参照してください方法最終的に違いはありません(私はOOPの概念を誤用が、最終生成物が同じであること偵察 - 私は期待して)

私の妄想について私にアドバイスをしてください。

ありがとうございます。 /** UPDATE#1/ /****************************************私たちはあなたのコードを見ることができないため、**/

+8

CL_Batchは何ですか? – BugFinder

+2

あなたのスニペットを 'foreach'に減らすことは、私たちの騒音を最小限にする方法ではありません。クラス全体のノイズを減らし、このクラスを減らした方がいいでしょう。あなたのforeachループではありません –

+1

あなたの問題はあなたのメモリ内の文字列の周りにあるかもしれませんが、実際の答えを見つけるためにこれをプロファイルする必要がありますdotMemoryまたは同様のものを使用する –

答えて

0

は私が悪いコンストラクタコードについての提案に反対しているにもかかわらず、その後、私はそれが違いを作り、コンストラクタからコードを削除した後に意図したとおりのコードが動作することを認めることをしなければなりません。 誰かが私のために良い説明をしているなら、それを聞きたいです。 はとにかくあり、私は君たち(BugFinder、 して、Callum Linington、 Mixxiphoid、 ManoDestra、 マイク・ロビンソン、 マシュー白く塗った、 スコットHannen)ソリューションのための信用を与えることができますか?

これは動作するコードです:

foreach (DataRow theRow in thisDataSet.Tables["Collection"].Rows) 
{ 
    LS_BatchAID = Convert.ToString(theRow["BatchAID"]); 
    LS_Batch = Convert.ToString(theRow["Batch"]); 
    LS_ID = Convert.ToString(theRow["ID"]); 
    CL_Batch Batch = new CL_Batch(LS_BatchAID, LS_ID, LS_Batch); 
    Batch.setRefnbr(); 
    Batch.setIDTypes(); 
    Batch.prepareLog(); 
    Batch.getFileNames(); 
    Batch.makePDF(); 
    Batch.insertPDF(); 
    Batch.makeXML(); 
    Batch.insertXML(); 
} 
thisConnection.Close(); 
+1

これは答えではありません。これを削除する必要があります。また、データループ内で処理しています。最後にBatch = null行は必要ありません。それは各反復が一度だけインスタンス化され、それはとにかく再インスタンス化されるので、無意味にnullに設定します。問題は後続の方法にあります。私はあなたがここでやっていることはしません。私はこの処理以外の別のループでその処理を行いますが、ロジックを少し壊してしまったために、メモリリークがどこで発生しているかを少なくとも今より少し確認することができます。 – ManoDestra

+0

@ManoDestraご返信ありがとうございます。プログラムに関しては、メモリ消費量が意図したとおりに上下に移動します。 データループ内の処理ステートメントについて。 これが好きでない場合、どうすればいいですか?前もって感謝します。 私に優しいしてください。ここで殴られているIm。 –

+1

これを行うには2通りの方法があります。あなたがここでやったやり方は、メモリ消費によってプログラムが落ちる行の感覚をより良くする必要があるからです。そこからドリルダウンして理由を調べることができます。個人的には、これらのメソッド呼び出し(.setRefnbr()、setIDTypes()など)をすべて2番目のループに移動します。したがって、上記のようにテーブルの行をループしますが、各CL_Batchをリストに追加してください。その後、このループの後でそのリストをループし、代わりにメソッドを呼び出します。理にかなっている? – ManoDestra

3

これは、暗闇の中で刺しています。あなたはPDFを作成しています。これには、しばしばCOMオブジェクトやメモリストリームが含まれます。おそらく、あなたがそれらのPDFを作成するために使用しているものは廃棄されたりクリーンアップされたりしないので、あなたが作成したすべてのPDFは、あなたがなくなるまでメモリに格納されます。私はあなたが使用しているコンポーネントのドキュメントを詳しく見ていきます。何かがIDisposableを実装している場合は、それを処分していることを確認してください。

関連する問題