winform跨线程操作webBrowser控件

一、解决问题

在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

猜你喜欢

转载自blog.csdn.net/kenjianqi1647/article/details/85161226
今日推荐