【问题标题】:do you know a simple and short way to make this work?你知道一个简单而简短的方法来完成这项工作吗?
【发布时间】:2020-07-05 22:20:09
【问题描述】:
 private void Form1_Load(object sender, EventArgs e)
{
  webbrowser.Navigate(url);
}
 private async void buttonDownload_Click(object sender, EventArgs e)
 {
      await Task.Run(()=> {
                MessageBox.Show(webBrowser.Document.GetElementsByTagName("body")[0].InnerHtml);
            });
}

错误显示“指定的转换无效”我读过它,这是因为另一个线程不是 ui 线程,你知道一个简单而简短的方法来完成这项工作吗?

【问题讨论】:

  • 删除任务。当文档完成时(即,当DocumentCompleted 被提升和webBrowser.ReadyState == WebBrowserReadyState.Complete 时),您可以阅读webBrowser.Document.Body.InnerHtml。运行任务确实不是您想要的,此外,所有内容都已经存在。但是,请阅读此处的注释:How to get an HtmlElement value inside Frames/IFrames?
  • 与问题没有直接关系,但您可能会觉得这很有帮助:WebBrowser wait until page has been fully loaded
  • 基本上我在文档完成时调用一个按钮的点击,然后按钮的动作将通过 ajax 显示新的 html 代码,我想得到那个响应,这个响应不能被处理DocumentCompleted 因为页面永远不会被 ajax 刷新,所以必须是使用 await.task.run 的东西,但它不起作用。

标签: c# async-await webbrowser-control


【解决方案1】:

编辑 您必须订阅 webBrowser.DocumentCompleted 事件

webBrowser.DocumentCompleted += completed;

private void completed(object sender, WebBrowserDocumentCompletedEventArgs e)
{
      if (sender is WebBrowser w)
      {
           var a = w.Document.GetElementsByTagName("body")[0].InnerHtml;
      }
}

private async void buttonDownload_Click(object sender, EventArgs e){
    webBrowser.Navigate(url);
}

我会像这样重写您的下载方法(我假设 webBrowser 对象正在执行一些“长时间”计算并且您不想阻塞 UI 线程)

private async void buttonDownload_Click(object sender, EventArgs e)
 {
     var htmlString = await Task.Run(()=> {
               return webBrowser.Document.GetElementsByTagName("body")[0].InnerHtml;
            });

     MessageBox.Show(htmlString);
}

另外,你确定这是正确的错误吗?也许您忽略了一些内部异常,这可以解释更多

【讨论】:

  • 感谢您的回答,不幸的是,这不,工作,同样的问题我必须添加我已经声明了这样的 webBrowser。
  • 公共 WebBrowser webBrowser = new WebBrowser();
  • 好的,做了一些研究。试试这个:WebBrowser w = new WebBrowser(); w.Navigate("www.google.com"); w.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) => { var a = w.Document.GetElementsByTagName("body")[0].InnerHtml; };
  • 基本上我在文档完成时调用一个按钮的点击,然后按钮的动作将通过 ajax 显示新的 html 代码,我想得到那个响应,这个响应不能被处理DocumentCompleted 因为页面永远不会被 ajax 刷新,所以必须是使用 await.task.run 的东西,但它不起作用。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 2010-09-27
  • 2017-08-28
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多