关于一个线程问题,应该很多人会把,大家帮忙,100分。

csdn02 2010-08-17 10:37:49

private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(fangfa));
th.Start();
}

private void fangfa()
{
WebBrowser webbrowser1 = new WebBrowser();
webbrowser1.Navigate("http://www.163.com");

while (webbrowser1.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
string strHTML = webbrowser1.DocumentText;
MessageBox.Show("fangfa");
}


就是线程里的方法里有控件的情况,会报错“cannot be instantiated because the current thread is not in a single-threaded apartment.”

就是说当前线程不是单线程,这种情况一般怎么处理呢。谢谢大家帮我看下。
...全文
111 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj0728 2010-08-17
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(runcode));
th.Start();
}
private void runcode()
{
WebBrowser.invoke(fangfa)
}
private void fangfa()
{
WebBrowser webbrowser1 = new WebBrowser();
webbrowser1.Navigate("http://www.163.com");

while (webbrowser1.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
string strHTML = webbrowser1.DocumentText;
MessageBox.Show("fangfa");
}




你现在的问题就是跨线程访问控件,需要使用控件的invoke方法来进行调用
byshome 2010-08-17
  • 打赏
  • 举报
回复
控件只能被创建他的线程使用。
一般是主线程。
线程中可以使用Invoke来更新界面层
csdn02 2010-08-17
  • 打赏
  • 举报
回复
th.SetApartmentState(ApartmentState.STA);这个是可以的。
CheckForIllegalCrossThreadCalls=false.
这个不行。

th.SetApartmentState(ApartmentState.STA);这个也有安全隐患吗?是不是设置线程什么状态的吧
指尖魔术师 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuyilin999 的回复:]

从.net2.0开始,默认情况下,控件只能被创建它的线程访问,其他被其他线程访问。
如果你想关闭这种限制,可以把控件.CheckForIllegalCrossThreadCalls属性设为False。
这样就可以直接从任何线程访问任何控件了,但是这种方法是不安全的。
[/Quote]
不可以跨线程操作WebBrowser,不考虑安全性的话,可以像 liuyilin999 所讲的一样,设置一下CheckForIllegalCrossThreadCalls=false.

也可以在线程中动态创建WebBrowser
johndii 2010-08-17
  • 打赏
  • 举报
回复
一开始接触托管非托管也不自在。线程安不安全谁说了算?估计它就是为可能会出问题的地方给予提示,就像数组越界它就告诉你不安全,但是这个是可以由程序员自己控制的。控件如果是封闭的就可以无视它吧。
testmemo 2010-08-17
  • 打赏
  • 举报
回复
th.SetApartmentState(ApartmentState.STA)
liuyilin999 2010-08-17
  • 打赏
  • 举报
回复
从.net2.0开始,默认情况下,控件只能被创建它的线程访问,其他被其他线程访问。
如果你想关闭这种限制,可以把控件.CheckForIllegalCrossThreadCalls属性设为False。
这样就可以直接从任何线程访问任何控件了,但是这种方法是不安全的。
soaringbird 2010-08-17
  • 打赏
  • 举报
回复
th.SetApartmentState(ApartmentState.STA);
csdn02 2010-08-17
  • 打赏
  • 举报
回复
自己顶贴,请大家帮忙啊,分不够再加啊。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧