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

本文转载:http://blog.csdn.net/playing9c/article/details/7471918

             http://blog.csdn.net/beelinkerlidejun/article/details/4772491

             http://www.cnblogs.com/fish124423/archive/2012/10/16/2726543.html

C#窗体的多线程一直是个难题,总是要出现奇奇怪怪的错误。今天开发alexSEO软件时,出现了在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。主要出现问题代码如下:

   protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            txtRFID_Click(null, null);

        }

View Code

 

   private void txtRFID_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(() =>
            {
                if (this.IsHandleCreated)
                    this.BeginInvoke(new MethodInvoker(() =>
                   {
                       this.txtRFID.Enabled = false;
                   }));

                int iRet = -1;
                string strTid = "";
                iRet = WriteCardHelper.Instance.ReadTID(ref strTid); //读取耗时的代码;                //注意:耗时的代码不能放在 this.BeginInvoke(new MethodInvoker(() => 耗时代码 })); //中执行;否则没有产生异步的效果。                //BeginInvoke中只能放置操作控件的代码。BeginInvoke将子线程线程通过委托抛向UI主线程 。

                if (this.IsHandleCreated)
                    this.BeginInvoke(new MethodInvoker(() =>
                    {
                        this.errorProvider.SetError(this.txtRFID, "");
                        if (0 == iRet)
                        {
                            WriteCardHelper.Instance.SetAlarm();
                            this.txtRFID.Text = strTid;
                            this.txtRFID.BackColor = Color.White;
                            this.errorProvider.SetError(this.txtRFID, "");
                        }
                        else
                        {
                            this.txtRFID.Text = "";
                            this.txtRFID.BackColor = Color.Pink;

                        }
                        this.txtGasBottleNo.Focus();
                        this.txtRFID.Enabled = true;
                    }));
            });
            thread.IsBackground = true;
            thread.Start();
        }

 

客户端:(实现异步打开窗体,该窗体加载的时候会读取设备的数据,但会很耗时,为了防止窗体加载时候由于耗时的代码,导致不能及时的显示出来)

 frmGasBottlesInstall frmInstall = new frmGasBottlesInstall(gasBottlesID);
 frmInstall.ShowDialog();  //异步打开窗口。

 

当调试运行中突然关闭软件时,labb.Invoke(labchange);语句就出先了“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”错误。想了一通出现这种情况应该有两种可能。第一种应该是界面还来不及响应Invoke,第二种是界面线程已经结束,所以响应不了。最后解决办法是在labb.Invoke(labchange);前加一个if(labb.IsHandleCreated)判断就可以了。

时间: 2024-09-24 17:40:57

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。的相关文章

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

问题描述 线程中每10ms就更新一次主界面的lable控件,使用的事件+委托更新.主界面自己没有更新时没有问题.但是主界面自己更新其中的gridview(非线程要更新的控件)时,就会报在创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke错误.查了下网上的解决办法,加了while(!this.IsHandleCreated){;},还是报错,不管用,如何解决还得请求帮助.谢谢! 解决方案 解决方案二:自己更新还要什么Invoke

WINdows 7可中SQL SERVER 2008安装时出现不能在控件上调用 Invok

我第一遍安装时,没有安装全部,结果,需要卸载重装,但是,重装时,出现不能在控件上调用 Invoke 或 BeginInvoke错误,在网上找了一圈,都是改注册表,结果根本找不到说的键值,注册表的 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager" 并将其下面的"PendingFileRenameOperations" 删掉. 后来,想一想,是不是权限问题,我做了两步.第一步,在s

用ASP.ENT创建带事件的用户控件

下面说下怎么创建带事件的用户控件:   标准的WEB空间有事件,来进行交互,同样用户控件也有.   要创建一个带事件的用户控件很简单,只需要三步:   1.定义个公开的(public) 的事件委托,如ClickEventHandler   2.在用户控件类中定义引发事件的方法,如OnClick方法   3.在引发事件的方法中判断事件是否为空,如果不为空,就可以写事件出来代码了.   下面我们来一步一步实现,   1.创建一个用户控件文件--LinkClick.ascx.   2.从工具箱中拖入L

ASP.NET 创建带事件的用户控件

ASP.NET 用户控件的创建与使用----在这篇中讲了用户控件的创建与使用. 下面说下怎么创建带事件的用户控件: 标准的WEB空间有事件,来进行交互,同样用户控件也有. 要创建一个带事件的用户控件很简单,只需要三步: 1.定义个公开的(public) 的事件委托,如ClickEventHandler 2.在用户控件类中定义引发事件的方法,如OnClick方法 3.在引发事件的方法中判断事件是否为空,如果不为空,就可以写事件出来代码了. 下面我们来一步一步实现, 1.创建一个用户控件文件--Li

wpf c#-有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢

问题描述 有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢 有没有办法将异步方法里创建的对象作为数据源关联到控件上...请指教,谢谢 我将一个异步生成的对象赋给了控件,提示以下异常: "必须在与 DependencyObject 相同的线程上创建 DependencySourc" 根据异常的提示 创建数据源与创建控件不是同一个线程,所以无法作为其数据源,请问有什么方法使得异步里创建的对象能够作为控件的数据源进行绑定.. //异步调用的方法: private vo

自动-VS2008中创建了个list contrl控件,读取excel中某单元格中有换行的问题,求大神解决

问题描述 VS2008中创建了个list contrl控件,读取excel中某单元格中有换行的问题,求大神解决 当单元格中有换行时,list contrl控件中的内容就不能显示出来? 能否进行自动换行? 解决方案 listctrl功能没这么强大,对excel格式的换行支持不了. 这个要你自己实现,你读取的时候,读到n换行时.自己把后面的插入下一行

mfc cmfctabctrl-用CMFCTabCtrl类创建一个Tab控件,然后在该控件上添加一个对话框

问题描述 用CMFCTabCtrl类创建一个Tab控件,然后在该控件上添加一个对话框 用CMFCTabCtrl类创建一个Tab控件,然后在该控件上添加一个对话框,但是添加之后,会出现setfouce的问题,也有__debugbreak()问题.. 有没有大神给个代码看看,我怎么改都不行

创建了一个UserControl1(控件),怎么循环它?(winform中)

问题描述 我创建了一个UserControl1(控件),这个控件里面放了一个panel,在PANEL中放了一个LABLE.四个RADIOBUTTON.我现在想循环它,并得到RADIOBUTTON的返回值.(winform中)LABLE中是放题目,RADIOBUTTON是选择项(单选)最好给点代码? 解决方案 解决方案二:在usercontrol里添加如下代码试试看:publicstringgetRadio(){foreach(Controlctrinthis.panel1.Controls){R

【大神sos】后台创建了ext的checkbox控件,添加到界面的panel中,如何设置checkbox之间的距离

问题描述 [大神sos]后台创建了ext的checkbox控件,添加到界面的panel中,如何设置checkbox之间的距离 解决方案 http://www.itzhai.com/extjs-based-on-background-data-of-dynamically-created-checkboxgroup-method.html