C#不能在控件上调用 Invoke 或 BeginInvoke

2022-07-02  本文已影响0人  大龙10
参考资料:https://www.cnblogs.com/idea555/articles/14808605.html
https://blog.csdn.net/baidu_38995168/article/details/115478182

1、现象:

  今天关闭一个窗体,报出这样的一个错误:
  "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。"。
  这个不用多想,肯定是那个地方没有释放掉。

2、原因

  winform最常见的是datagridview这个控件,不管重写还是怎么,很多数据的操作都是用datagridview来展示的,因此,它的异步调用也算是比较多的一类了。
比如:

  不用异步肯定会出现死机的情况,用了异步可能也要注意一些情况:

3、有关方法

4、解决办法

增加了一条判断语句,解决问题

if (IsDisposed || !this.IsHandleCreated) return;

部分程序

             Bitmap bitmap = new Bitmap((int)ImageInfo.iWidth, (int)ImageInfo.iHeight, (int)ImageInfo.iWidth * 3, PixelFormat.Format24bppRgb, pRGBFrame);
               if (m_isNeedSave)
               {
                   bitmap.Save("d:\\camera_test1.bmp");
                   m_isNeedSave = false;
               }
               //////////////////////////////////显示
               if (IsDisposed || !this.IsHandleCreated) return;
               ///////
               this.BeginInvoke(new Action(() =>
               {
                   this.pictureBox.Image = bitmap;
               }));
               //释放由 CameraGetRawImageBuffer 获得的缓冲区
               CKAPI.CameraReleaseFrameHandle(m_hCamera, hBuf);
           }
           CKAPI.CameraPause(m_hCamera);
上一篇 下一篇

猜你喜欢

热点阅读