【问题标题】:How to deal with create window handle exception when add custom control to a panel in C#?在C#中将自定义控件添加到面板时如何处理创建窗口句柄异常?
【发布时间】:2016-07-26 15:07:58
【问题描述】:

目前我有一个程序来显示一些项目信息。我有一个com box 来练习不同的类别,以及一个面板来显示com box 中每个选择的项目。

我创建了自己的自定义控件来显示,但是当我将它动态添加到面板时,它会导致 Win32 Exception 即 Create Window handle Error。

经过多次测试,我注意到一旦面板总共列出了 1800 个自定义控件,就会出现异常。有没有人可以解决这个问题?谢谢。

private void DisplayItems(List<ITEM_DATA> ItemList)
{
    DisposeControls();
    int total = ItemList.Count;

    ItemDisplayer itemDisplayer = null;
    Application.DoEvents();
    for (int i = 0; i < total / 4 + 1; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            int m = (i * 4) + j;
            if (m >= total)
            {
                return;
            }
            itemDisplayer = new ItemDisplayer(ItemList[m], ref labItemName);
            itemDisplayer.Size = new Size(240, 80);
            itemDisplayer.Location = new Point(240 * j, 80 * i);
            itemDisplayer.Name = "itemDisplayer" + Convert.ToString(m);
            pnlItems.Controls.Add(itemDisplayer); 
        }
    }
}

【问题讨论】:

  • 您使用的所有程序可以创建的窗口总数的硬性上限为 65535。Windows 确保程序不会占用其不公平的份额通过将其总数限制为 10000。当您超过该限制时,您将获得此异常。也许您正在泄漏控件,请使用任务管理器并添加 USER Objects 列,以便查看总数。但是你需要编写更智能的代码的几率很高,1800 已经很不合理了。
  • 是的,我听从了你的建议。问题是用户对象达到 10000。知道如何解决吗?谢谢

标签: c# win32exception


【解决方案1】:

只是想确认一下。花了一段时间才弄清楚这个问题发生在哪里。我意识到用户对象已达到限制 10000。我刚刚通过正确处理用户控件解决了这个问题。

我在自定义控件类中重新实现了 dispose 方法。

 // Flag: Has Dispose already been called?
   bool disposed = false;
   // Instantiate a SafeHandle instance.
   SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         handle.Dispose();
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }

根据enter link description here

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2020-11-02
    • 2013-12-10
    • 2010-10-06
    • 2020-06-09
    • 1970-01-01
    • 2017-05-02
    • 2011-10-17
    相关资源
    最近更新 更多