2017-04-27 46 views
3

私は今度は中程度のwinformsアプリケーションをコーディングしています...毎回、特定のフォームの作成時にこの例外が発生します。私は過去になく、何が起こっているかを適切にudnerstandingせずに、それを解決し'System.OutOfMemoryException':ウィンドウハンドルを作成中にエラーが発生しました。

...

不可解な部分は、今、私はこれを取得、私はこのフォームをfinnishedし、それをテストしたときにすべてがうまく昨日働いたということです。

型「System.OutOfMemoryExceptionに」の未処理の例外は、のSystem.Windows.Forms.dll

追加情報に を発生します。エラーはウィンドウハンドルを作成します。

public partial class PonovniIspisRacunaForm : Form 
     {  

     DataTable dnevniPrometTable; 
     DataTable kontrolnaTrakaTable; 
     DataTable ukupniDnevniPrometTable; 
     DataTable stavkeRacunaTable; 
     ZisCode.Hibernate.Mdb.DataModel dnevniPrometDataModel; 
     ZisCode.Hibernate.Mdb.DataModel kontrolnaTrakaDataModel; 
     OsnovniPodaci.Porezi.Stope stope; 
     string brojRacuna; 
     string ZKI; 
     string JIR; 
     string Operator; 
     //decimal ukupno = 0.00m; 

     decimal tarifa; 
     decimal kolicina; 
     decimal iznos; 
     decimal porez; 
     decimal porez25; 
     decimal porez05; 
     decimal porez13; 
     decimal povratnaUkupno; 
     decimal osnov25; 
     decimal osnov05; 
     decimal osnov13; 
     //decimal nabavna; 

     PrintDocument printDocument; 

     public PonovniIspisRacunaForm() 
     { 
      InitializeComponent(); 
     } 

    private void FinancijskiRekapitular_Load(object sender, EventArgs e) 
      { 
       stope = new OsnovniPodaci.Porezi.Stope(); 

       // popunjava današnji datum 
       this.dtpDatum.Value = DateTime.Today; 

       // Get Data Table za određeni datum: 
       dnevniPrometDataModel = ZisCode.DataModels.Get("DnevniPromet"); 
       kontrolnaTrakaDataModel = ZisCode.DataModels.Get("KontrolnaTraka"); 

       PrintSetup(); 

       ukupniDnevniPrometTable = MergeDnevniKontrolna(); 
       if (ukupniDnevniPrometTable.Rows.Count != 0) 
       { 
        FillComboBox(); 
      } 
     } 
    private void FillComboBox() 
      { 
       cbBrojRacuna.DataSource = ZisCode.Methods.DataTableOperations.SortDataTable(ukupniDnevniPrometTable, "Dokument", "DESC") // orderbydescending 
        .AsEnumerable().GroupBy(row => row.Field<string>("Dokument")).Select(group => group.First()).CopyToDataTable(); // groupby brojRacuna-Dokument 
       cbBrojRacuna.DisplayMember = "Dokument"; // Broj Računa 
       cbBrojRacuna.ValueMember = "Dokument"; 
       cbBrojRacuna.SelectedIndex = 0; 
      } 

      private void PrintSetup() 
      { 
       // priprema za ispis 
       printDocument = new PrintDocument(); 
       printDocument.DefaultPageSettings.PaperSize = new PaperSize("Racun size", 295, 500); 
       printDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(CreateRekapitular); 
       // uklanja poruku dialog box (printing ..) kod ispisa 
       PrintController printController = new StandardPrintController(); 
       printDocument.PrintController = printController; 
       // popravlja font 
       printPreview.UseAntiAlias = true; 
      } 
} 

この線より具体的には:

例外がコードブロックでスローさthis.dtpDatum.Value = DateTime.Today。 なぜですか?私は考えていない...

私は、コンストラクタでdateTimePickerを設定しようとしましたが、私はウィンドウハンドルとは無関係に別の例外があります。

私は他の質問でこのケースについて読んだことがありますが、実際には私は何もクリックしませんでした。

Error Creating Window Handle

Winforms issue - Error creating window handle

これらの2つの答えは、答えが曖昧にされているので、私を助け、私は最初の場所で働くことになっている方法を知って処分することを期待しないでください。ヘルプ、私はn00bです!

UPDATEそれはあなただけのメモリが不足しているということかもしれにOutOfMemoryあなたの例外はあるので、私は

+0

あなたはPrintSetupとFillComboBox(のためのいくつかのコードを追加することができます引き起こされたと思います

dtpDatum_TextChanged(object sender, EventArgs e) { ukupniDnevniPrometTable = MergeDnevniKontrolna(); FillComboBox(); } 

ます。private voidでしたか?いくつかの一般的な変数がありますか?フォームを閉じるときに何をしますか? –

+0

@WaiFungAuYeungはい私は変数の束を持っていますし、私はそれをどうすればいいですか? – ChenChi

+0

というフォームをロードするときにこの例外がスローされても、私はそのコードをさらにコード – ChenChi

答えて

1

を頼まれたように、クラスのほぼすべてのコードを投稿。あなたが利用可能なメモリの量を確認するにはタスクマネージャをチェックし、RedGateのようなメモリプロファイラや、漏れがどこにあるかを確認するのに似た何らかの方法でアプリケーションを実行することをお勧めします。廃棄の場合は、詳細についてはこちらをご覧ください。C# Form.Close vs Form.Dispose

+1

で更新しました。それは問題だと思います。カスタムのユーザコントロールであるため、dateTimePickerは処理しませんでしたか? dtpが例外のソースなので、私は確かにここにいると推測しています。 – ChenChi

4

ウィンドウハンドルはアンマネージドリソースです。彼らの数だけがあります。これらのハンドルを解放しないと、Windowsが使い果たされ、例外が発生します。

ネイティブHANDLEを使用するクラスは、不要になったときに解放する必要があります。これらのクラスはIDisposableを実装します。これは.NETの中核部分であり、ハンドルなどの管理されていないリソースを操作する上で重要です。あなたの静的コード解析の

電源を入れます(右Projectをクリックしてください - >Properties - >Code AnalysisEnable on buildを選択し、Microsoft all rulesを選択)し、すべての違反、特に非配置されたIDisposableのを修正。

+0

nvoigtは返信してくれてありがとう、私はこのオプションが存在するかどうかわからなかった - 今は大きなn00bのように感じる... – ChenChi

0

問題は、私は)このイベントは、あまりにも多くの時間を解雇し、メモリリーク

関連する問題