WebBrowser的问题

MYsce 2018-01-09 11:56:31
在线程里调用webbrowser
if (webBrowser.ReadyState == WebBrowserReadyState.Complete)
错误 :尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
请问各位大神如何解决!!!
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MYsce 2018-01-12
  • 打赏
  • 举报
回复
引用 4 楼 kampoo 的回复:
C#的UI线程是独立于其他线程的,对UI控件的操作必须在UI线程中执行,这是由GUI整体架构决定的。(其他语言如VC++/Java的机制也一样) 如果需要在其他线程中访问UI控件: 1. BackgroundWorker比较常用,所有UI控件可以ProgressChanged 以及 WorkCompleted事件中访问,打开ProgressReported开关,编写ProgressChanged以及WorkCompleted事件。(针对你的需求,可以在ProgressChanged中访问WebBrowser控件的状态,并赋值到某个普通变量中,然后在BackgroundWorker.DoWork中访问。对多次访问UI控件状态的情况很方便,每次ProgressChanged事件参数设置要执行的指令及传入参数) 2. 异步事件,包括BeginInvoke及EndInvoke一对操作,单次操作很简洁。(对多次访问UI控件状态不是太方便,每次都要调用这一对操作) 3. 多次重复简单执行可以考虑Timer,会在UI线程中执行操作,效率不高,耗时的方法体操作会卡住界面。
我在ProgressChanged 里创建了几个webbrowser会卡主界面,请问如何解决因为我要得到这个webbrowser html源码
kampoo 2018-01-12
  • 打赏
  • 举报
回复
如果只是获取URL地址的html源码(而不需要执行其中的js脚本),直接使用System.Net.WebClient / WebRequest就可以获得返回的HTML。 如果确实需要访问URL获得HTML源码并执行其中的脚本,请尝试新建一个窗体,将WebBrowser放在新窗体中执行,以非模式显示窗体; 这种情况下新窗体将会卡住,但不影响它的父窗体; 如果需要返回值,在新窗体中增加一个回调函数。 (请测试。理论上可行,实际我没有这么用过)
引用 5 楼 MYsce 的回复:
我在ProgressChanged 里创建了几个webbrowser会卡主界面,请问如何解决因为我要得到这个webbrowser html源码
秋的红果实 2018-01-12
  • 打赏
  • 举报
回复
另一个帖子里回复过了,
from_taiwan
现在有的页面都是按照需要加载内容的,页面拉倒最下面才加载 你要抓取的内容根本没到你的客户机,怎么抓取 不过,只要用心,或许总有办法,这里支持一下 非UI线程里webbrowser出问题,那你为什么不放到UI里面处理呢? 给你推荐个可以替代webbrowser的东西geckofx,比前者好使。具体自己搜索下
神马都能聊 2018-01-11
  • 打赏
  • 举报
回复
不要在线程里调用,如果必须如此,那么在控件所在消息循环(比如某个窗口)上开一个一个方法,这个方法供你的线程调用,类似这样的写法。 public void xx() { lock (lockObject) { if(yy.InvokeRequired) { yy.Invoke... { BrowseComplete(); } } else { BrowseComplete(); } } } public bool BrowseComplete() { return webBrowser == null? true: webBrowser.ReadyState == WebBrowserReadyState.Complete; }
hhhhha123 2018-01-11
  • 打赏
  • 举报
回复
好像线程就不行
kampoo 2018-01-11
  • 打赏
  • 举报
回复
C#的UI线程是独立于其他线程的,对UI控件的操作必须在UI线程中执行,这是由GUI整体架构决定的。(其他语言如VC++/Java的机制也一样) 如果需要在其他线程中访问UI控件: 1. BackgroundWorker比较常用,所有UI控件可以ProgressChanged 以及 WorkCompleted事件中访问,打开ProgressReported开关,编写ProgressChanged以及WorkCompleted事件。(针对你的需求,可以在ProgressChanged中访问WebBrowser控件的状态,并赋值到某个普通变量中,然后在BackgroundWorker.DoWork中访问。对多次访问UI控件状态的情况很方便,每次ProgressChanged事件参数设置要执行的指令及传入参数) 2. 异步事件,包括BeginInvoke及EndInvoke一对操作,单次操作很简洁。(对多次访问UI控件状态不是太方便,每次都要调用这一对操作) 3. 多次重复简单执行可以考虑Timer,会在UI线程中执行操作,效率不高,耗时的方法体操作会卡住界面。
圣殿骑士18 2018-01-10
  • 打赏
  • 举报
回复
线程里怎么能调用UI控件。使用BeginInvoke调用

110,533

社区成员

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

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

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