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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值