Form1:
...
RunWeb rw=new RunWeb();
rw.StartThread(this.tabpControl1);
...RunWeb:TabPage tp;
WebBrowser wb;
Thread td;
string url="http://";
public RunWeb()
{
tp=new TabPage();
web=new WebBrowser();
td=new Thread(new StartThread(DoWork));
}public void StartThread(TabControl tc)
{
web.Navigate(url);
tp.Controls.Add(web);
//我想在这里把这个线程中的tp加入Form1中的tabControl1中去,在网上找了很久,应该用Invoke方法,可是水平有限没理解工作方法不会使用Invoke,请大侠帮帮我,Form1是不是叫做主线程,也叫UI线程?
}

解决方案 »

  1.   

    线程中请不要用用UI界面的东西。请这样做Form1: 
    ... 
    RunWeb rw=new RunWeb(); 
    rw.StartThread(this.tabpControl1); 
    ... RunWeb: TabPage tp; 
    WebBrowser wb; 
    Thread td; 
    string url="http://"; 
    public RunWeb() 

    tp=new TabPage(); 
    web=new WebBrowser(); 
    td=new Thread(new StartThread(DoWork)); 
    } public void StartThread(TabControl tc) 

    this.Invoke(new MethodInvoker(UImethod));
     } 
     void UImethod()
            {
     
            }
    如果要传参数,请用带参数的委托
      

  2.   

    没有this.Invoke()啊!RunWeb是个类,不是Form
      

  3.   

    实际上我是想把线程中的TabPage和WebBrowser在Form1中的tabControl1中显示出来
      

  4.   

    谁创建了form1谁就是它的主线程
      

  5.   

    楼主是希望实现 基于IE核的带选项卡浏览器吧,不过你的做法并不是很好,稍微改造下应该就可以把TabPage 添加进Form1实例中:
    修改的代码如下:注意 代码没有测试。
    Form1: 
    ... 
    //添加其他线程访问主线程tabcontrol并添加tabpage的委托
    public delegate void addtabelpagecallback(TabPage _tp);
    RunWeb rw=new RunWeb(); 
    rw.StartThread(this); 
    //在tabcontrol中添加TabPage
    public void AddTabelPage(TabPage _tp)
    {
                if (this.tabpControl1.InvokeRequired)
                {
                    addtabelpagecallback atpcb = new addtabelpagecallback(AddTabelPage);
                    this.Invoke(atpcb, new object[] { _tp });
                }
                else
                    this.tabpControl1.TabPages.Add(_tp);
    }

    ... RunWeb: TabPage tp; 
    WebBrowser wb; 
    Thread td; 
    string url="http://"; 
    public RunWeb() 

    tp=new TabPage(); 
    web=new WebBrowser(); 
    td=new Thread(new StartThread(DoWork)); 
    } //修改StartThread 此处传入的应为Form1的实例
    public void StartThread(Form1 _form) 

    wb.Navigate(url); 
    tp.Controls.Add(wb); 
    //this(Form1)只是主线程中的一个实例,当其他线程要访问(Invoke)主线程中Form1实例中的Control 时 将发生问题.所以在Form1中添加其他线程得以访问Form1 tabControl控件的支持委托addtabelpagecallback,并添加方法AddTabelPage。此处则只需调用Form1实例方法AddTabelPage。
    _form.AddTabelPage(tp);

      

  6.   

    楼主的工程实现并不是很好,建议楼主去看看 <<设计模式>> 一书,另,以上代码我进行了测试,是成功的。
      

  7.   

    非常感谢fanoh,一直把Invoke放在RunWeb中,怎么也不通。
    没有写成一个象样的程序,总是想到哪写到哪。
    你的说的<C#设计模式>是不是James W.Cooner著 这本。
    还有就是
    Form1: 
    ... 
    //添加其他线程访问主线程tabcontrol并添加tabpage的委托 
    public delegate void addtabelpagecallback(TabPage _tp); 
    RunWeb rw=new RunWeb(); 
    rw.StartThread(this); 
    //在tabcontrol中添加TabPage 
    public void AddTabelPage(TabPage _tp) 

                if (this.tabpControl1.InvokeRequired) 
                { 
                    addtabelpagecallback atpcb = new addtabelpagecallback(AddTabelPage); 
                    this.Invoke(atpcb, new object[] { _tp }); 
                } 
                else 
                    this.tabpControl1.TabPages.Add(_tp); 

    ... RunWeb: TabPage tp; 
    WebBrowser wb; 
    Thread td; 
    string url="http://"; 
    public RunWeb() 

    tp=new TabPage(); 
    web=new WebBrowser(); 
    td=new Thread(new new ParameterizedThreadStart(StartThread)); 
    //可是我又不会传参数了

    } //修改StartThread 此处传入的应为Form1的实例 
    public void StartThread(Form1 _form) 

    wb.Navigate(url); 
    tp.Controls.Add(wb); 
    //this(Form1)只是主线程中的一个实例,当其他线程要访问(Invoke)主线程中Form1实例中的Control 时 将发生问题.所以在Form1中添加其他线程得以访问Form1 tabControl控件的支持委托addtabelpagecallback,并添加方法AddTabelPage。此处则只需调用Form1实例方法AddTabelPage。 
    _form.AddTabelPage(tp);