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

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

主要出现问题代码如下:

 

代码
public   void runSEO()
        {

                
while ((urlhead = sr.ReadLine()) != null)
                {

                    
try
                    {
                        num 
= num + 1;
                        HttpWebRequest request 
= (HttpWebRequest)WebRequest.Create(urlhead + url);
                        request.Timeout 
= int.Parse(tout.Text.ToString()) * 1000;
                        HttpWebResponse response 
= (HttpWebResponse)request.GetResponse();
                       
if(labb.IsHandleCreated)
                        labb.Invoke(labchange); 
                    }
                    
catch
                    {               
                    }
                          
                }

                sr.Close();
            
if(run.IsHandleCreated)
                run.Invoke(btnchange);
            
this.myThread.Abort();
            
        }

 


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

posted @ 2011-08-26 16:58  therockthe  阅读(344)  评论(0)    收藏  举报