我遇到了问题,我正在尝试使用特定网站的自定义网络浏览器。
我遇到GeckoFX的问题是有时我需要等待DocumentCompleted继续执行特定方法。 我不想将我的所有代码放入一个大型的DocumentCompleted事件中,因为这看起来很愚蠢和错误。
我通过如下使用Application.DoEvents()获得了代码,但我读到这不是一种正确的方法,而且webbrowser应该最好以异步方式运行。
private void AddNewTab(string tmsAddress) //add a new browser to my form
{
TabPage tab = new TabPage();
browserTabControl.TabPages.Insert(browserTabControl.TabCount - 1, tab);
GeckoWebBrowser browser = new GeckoWebBrowser();
tab.Controls.Add(browser);
tmsBrowser.Dock = DockStyle.Fill;
tmsBrowser.Navigate(address);
tmsBrowser.DocumentCompleted += new EventHandler<Gecko.Events.GeckoDocumentCompletedEventArgs>(tmsBrowser_DocumentCompleted);
}
页面上的导航是手动的,即用户正常使用页面,但有时他们可以使用快捷按钮到达某个地方。
private void someButton_MouseUp(object sender, MouseEventArgs e)
{
GeckoWebBrowser browser = getCurrentBrowser();
//get some data from the page here
OpenPageInContentFrame(address + parameter1 + parameter2); //I need to wait for this page to load and then do HighlightItemRow()
while (!eventHandled) //documentCompleted events sets the bool as 'true'
{
Application.DoEvents();
}
HighlightItemRow(browser, parameter1);
}
}
我想使用ManualResetEvents而不是while()和Application.DoEvents(),但是使用manResEvent.WaitOne()会导致整个应用程序冻结,包括导航,因此页面实际上从未加载。我认为这一定是因为它只是在一个线程中,我不知道如何让它工作 - 我从来没有使用任何异步等。