2017-04-27 122 views
3

我正在编写一个中等winforms应用程序...每隔一段时间,然后创建某些窗体,我得到这个异常。'System.OutOfMemoryException':创建窗口句柄时出错

我解决它在过去,但没有什么事情的正确udnerstanding ...

令人费解的部分是,昨天的一切工作得很好,当我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; 为什么?我不知道...

我试着seting dateTimePicker在构造函数中,我得到了不同的异常与窗口句柄无关。

我已阅读关于其他问题的这种情况,但没有真正点击我。

Winforms issue - Error creating window handle

Error Creating Window Handle

这两个答案不帮我,因为答案是模糊的,希望我知道如何处置应该排在首位的工作。帮助,我是一个n00b!因为有人问我

+0

你可以添加一些代码PrintSetup和FillComboBox()?你有一些一般的变数,你在关闭表格时做了什么? –

+0

@WaiFungAuYeung是的,我确实有一堆变数,并在关闭表格我不处理大声笑我应该怎么做?即使加载表格 – ChenChi

+0

时引发了这个异常我用更多的代码更新了这个问题 – ChenChi

回答

1

由于您的例外是内存不足,可能是你刚出来的内存

UPDATE发布之类的几乎所有的代码。检查任务管理器,看看你有多少内存可用,我建议通过像RedGate这样的内存分析器或类似的东西来运行你的应用程序,以查看泄漏的位置。在处置的情况下,请查看此处以了解更多信息C# Form.Close vs Form.Dispose

+1

我不认为这是问题,可能是因为它是一个自定义用户控件,dateTimePicker没有配置(?!)。 。im不知道我只是猜测这里的voer因为dtp是异常的来源 – ChenChi

4

窗口句柄是非托管资源。只有这么多。如果你没有释放这些句柄,Windows将用完,你会得到例外。

使用原生HANDLE的类需要在不再需要时释放它们。这些课程将实施IDisposable。您应该研究这一点,它是.NET的核心部分,对于使用非托管资源(如句柄)至关重要。

打开您的静态代码分析(右键单击Project - >Properties - >Code Analysis并选择Enable on build并挑选Microsoft all rules)和修复所有违规行为,尤其是那些非配置IDisposable秒。

+0

nvoigt谢谢你的回复,我不知道这个选项,甚至存在 - 现在我觉得像大n00b ... – ChenChi

0

问题是私人无效

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

我想这事件被解雇了太多次,造成内存泄露