c# 中 控件WebBrowser 跨线程问题,求解决

在我的程序中,用一个类B来动态生成控件WebBrowser到主窗体类FORM1中。在FORM1中,会有循环,利用System.Timers.Timer,经过一段时间后,再... 在我的程序中,用一个类B来动态生成控件WebBrowser到主窗体类FORM1中。在FORM1中,会有循环,利用System.Timers.Timer,经过一段时间后,再次 实例化类B,再次生成 WebBrowser。循环的第一次没问题,但第二次循环时,就出现问题“当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。”请问如何解决呢?求详细代码解决 展开
 我来答
freeeeeewind
2014-04-19 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1353万
展开全部
        //System.Timers.Timer timer 的定时回调函数
        void timer_Elapsed(object sender, ElapedEventArgs e)
        {
            //这个回调函数是运行在另一个线程上,对窗体上控件操作需要跨线程调用
            this.Invoke((MethodInvoker)delegate
            {
                WebBrowser web = new WebBrowser();
                web.Location = new Point(0, 0);
                web.Dock = DockStyle.Fill;
                this.Controls.Add(web);
            });
        }
追问
大神,我是想要每实例化一次类B,就生成一个WebBrowser控件(如果像你写的,我会每一次刷新就生成一个web控件),所以WebBrowser web = new WebBrowser();  这句是想要在
this.Invoke((MethodInvoker)delegate {。。。。。} 之前,那我应该如何做呢?
追答
   public class B
    {
        public B(Form form)
        {
            this.form = form;
        }
        
        Form form;
        
        public void CreateWebBrowser()
        {
            form.Invoke((MethodInvoker)delegate
            {
                WebBrowser web = new WebBrowser();
                web.Location = new Point(0, 0);
                web.Dock = DockStyle.Fill;
                form.Controls.Add(web);
            });
        }
    }
}

 在窗口Form1.cs中

void t_Elapsed(object sender, ElapsedEventArgs e)
        {
            B b = new B(this);
            b.CreateWebBrowser();
        }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式