一、解决问题
在winform上调用百度地图,使用了webBrowser控件。当不跨线程时,使用正常。使用子线程操作webBrowser控件时出现了一下错误。
子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间所导致的。对于一般的控件,当子线程操作控件时,只要在窗体启动加载时加入以下一句就可以解决跨线程问题。
使用线程检查方式为无的方法:
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//取消线程间的安全检查 解决线程间操作UI问题
但是对于webBrowser控件无能为力。
二、解决方案
1、使用 Timer控件
由于这个控件运行在UI线程上,在这个线程上注册一个事件
不用设置中断定时时间
private void timer1_Tick(object sender, EventArgs e)
{
// 需要对webBrowser操作的方法
}
窗口加载时,开启定时器。这样做测试可以用,但是控制不灵活,白白占用了很多CPU,而且不能叫做跨线程,只是在UI线程上开启一个定时器轮询,当子线程的参数变化之后会影响到轮询执行的内容。
2、使用MethodInvoker方法跨线程
作用就是让子线程告诉窗体线程来完成相应的控件操作
//1、设置子线程函数
private void ThreadFun()
{
//子线程里调用UI线程执行InvokeFun()
MethodInvoker test = new MethodInvoker( this.InvokeFun );
this.BeginInvoke(test);
}
//2、设置UI线程里要执行的函数
private void InvokeFun()
{
}
//3、调用子线程
Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );
thdProcess.Start();
这种方法使用很简单的解决了子线程调用主线程的问题。
3、使用委托
参考:https://blog.csdn.net/tonggen7135/article/details/78748067