C# 如何从BackgroundWorker导航WebBrowser.Navigate()?
我选择在当前开发的应用程序中使用C# 如何从BackgroundWorker导航WebBrowser.Navigate()?,c#,winforms,webbrowser-control,backgroundworker,C#,Winforms,Webbrowser Control,Backgroundworker,我选择在当前开发的应用程序中使用BackgroundWorker的唯一原因是通过WebBrowser将耗时较长的浏览从UI线程移开 但是WebBrowser.Navigate()不是在访问UI吗 换句话说,我经历了所有这些努力,结果却落在了同一个地方(或者更糟!因为我不知道非UI线程在访问UI控件时会有什么副作用) 我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:什么是可以接受的解决这个问题的方法?i、 e.从BackgroundWorker?Navigate()到WebBrowse
BackgroundWorker
的唯一原因是通过WebBrowser
将耗时较长的浏览从UI线程移开
但是WebBrowser.Navigate()
不是在访问UI吗
换句话说,我经历了所有这些努力,结果却落在了同一个地方(或者更糟!因为我不知道非UI线程在访问UI控件时会有什么副作用)
我很确定我不是第一个想要实现这样的东西的人,所以我的问题是:什么是可以接受的解决这个问题的方法?i、 e.从BackgroundWorker
?Navigate()
到WebBrowser.Navigate()
不是阻止调用(请参见中的第一行),但它会更新UI,因此需要从UI线程调用它
您有两个选择:
Invoke
调用从BackgroundWorker封送Navigate()
调用到UI线程Navigate()
,并侦听WebBrowser DocumentCompleted事件public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void _goButton_Click(object sender, EventArgs e)
{
_webBrowser.Navigate("http://google.com/");
// Non-blocking call - method will return immediately
// and page will load in background
}
private void _webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// Navigation complete, we can now process the document
string html = _webBrowser.Document.Body.InnerHtml;
// If the processing is time-consuming, then you could spin
// off a BackgroundWorker here
}
}
Navigate()
不是阻塞调用。@SLaks什么意思?实际上,我可以看到,当一个网站的页面被(缓慢地)加载时,表单的按钮和UI没有响应。这是通过WebBrowser.Navigate()
从worker\u DoWork(object sender,dowworkeventargs e)
@ateiob调用的。BackgroundWorker的评论特别指出:“您必须小心,不要在DoWork事件处理程序中操纵任何用户界面对象。相反,通过BackgroundWorker事件与用户界面进行沟通。@Munchies这正是我在OP中要问的:如何“通过BackgroundWorker事件与用户界面进行沟通”?@ateiob那么你想发生什么?您通常会在ProgressChanged或RunWorkerCompleted事件处理程序中与UI交互。我不知道你为什么要在单个方法调用中使用后台工作程序。