码迷,mamicode.com
首页 > 其他好文 > 详细

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

时间:2021-01-30 11:41:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sha   log   ntp   操作   nbsp   lis   代码   dex   循环   

“在Window窗体程序开发的时候,如果使用多线程编程,在子线程中访问主线程窗体内的控件,就需要使用控件的Control.Invoke方法或者BeginInvoke方法。但是有时候因为Window执行速度太快,尤其是你写代码的时候在InitializeComponent();完成之前起了一个线程去执行某些操作,涉及到窗体控件的,当你在调用Control.Invoke的时候,就可能出现 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”错误。

解决的办法就是让线程等待,直到窗口句柄创建完毕:

//防止在窗口句柄初始化之前就走到下面的代码 
while (!this.IsHandleCreated) 
{ 
    ; 
} 
this.BeginInvoke(new ProListIndexChangedDelegate(GetProLyric));

//根据不同情况也可以: 
if (this.IsHandleCreated) 
BeginInvoke(new ProListIndexChangedDelegate(GetProLyric));

有一个更巧妙的方法,只要在BeginInvoke方法的调用语句前再加一句:IntPtr i = this.Handle;就OK了,这比死循环配合this.IsHandleCreated的判断方法更简洁,因为this.Handle这个属性本身就对应一个方法,取不到句柄,程序就不会向下进行。

 

转载:https://blog.csdn.net/m0_37862405/article/details/78387226

浊酒入清梦

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

标签:sha   log   ntp   操作   nbsp   lis   代码   dex   循环   

原文地址:https://www.cnblogs.com/zhangsong-sir/p/14344000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!