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线程?
}
...
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线程?
}
...
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()
{
}
如果要传参数,请用带参数的委托
修改的代码如下:注意 代码没有测试。
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);
}
没有写成一个象样的程序,总是想到哪写到哪。
你的说的<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);
}