比如下面代码,为什么子线程中,很多语句没办法执行,而放在主线程里就可以正常执行。为什么不行,要如何才可以~~~我创建多线程是因为我用了hread.Sleep(5000)延时,如果不在别的线程中运行,界面就是卡死。 private void button1_Click(object sender, EventArgs e)
{ Thread thread = new Thread(new ThreadStart(WriteData));
thread.Start(); }
protected void WriteData()
{
webBrowser1.Navigate(new Uri("http://wb.renren.com")); //这句可以执行
Thread.Sleep(5000); //延时
textbox1.text="1111"; //这句无法执行
webBrowser1.Document.All["query"].InnerText = "ABC"; //无法执行
}
{ Thread thread = new Thread(new ThreadStart(WriteData));
thread.Start(); }
protected void WriteData()
{
webBrowser1.Navigate(new Uri("http://wb.renren.com")); //这句可以执行
Thread.Sleep(5000); //延时
textbox1.text="1111"; //这句无法执行
webBrowser1.Document.All["query"].InnerText = "ABC"; //无法执行
}
所以为了安全framework会禁止修改其他线程创建的控件
如果需要改动,必须实现线程安全
2种方法
1.在BackgroundWorker线程中修改控件
2.用这种方式修改 delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
解决方法二:
取消控件的跨线程检测
在窗体的load函数中加入如下代码:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;
protected void WriteData()
{
webBrowser1.Navigate(new Uri("http://wb.renren.com")); //这句可以执行
System.Threading.Thread.Sleep(5000); //延时 Action d1 = delegate()
{
textbox1.Text = "1111"; //这句无法执行
};
textbox1.Invoke(d1); Action d2 = delegate()
{
webBrowser1.Document.All["query"].InnerText = "ABC"; //无法执行
};
webBrowser1.Invoke(d2);
}