在创建窗口句柄之前,不能在控件上调用 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)判断就可以了。

打赏

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注