等待 Web 浏览器文档使用自动重置事件完成

本文关键字:事件 浏览器 Web 文档 等待 | 更新日期: 2023-09-27 18:34:38

我希望我的函数等到事件WebBrowser.DocumentCompleted完成。

我正在使用AutoResetEvent这是我的代码:

private static WebBrowser _browser = new WebBrowser();
private static AutoResetEvent _ar = new AutoResetEvent(false);
private bool _returnValue = false;
public Actions() //constructor
{
        _browser.DocumentCompleted += PageLoaded;
}
public bool MyFunction()
{
    _browser.Navigate("https://www.somesite.org/");
    _ar.WaitOne(); // wait until receiving the signal, _ar.Set()
    return _returnValue;
}
private void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // do not enter more than once for each page
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
        return;
    _returnValue = true;
    _ar.Set(); // send signal, unblock my function
}

在这里,我的问题是,PageLoaded永远不会被触发,我的函数卡在_ar.WaitOne();上。如何解决此问题?也许还有另一种方法可以实现这一目标?

等待 Web 浏览器文档使用自动重置事件完成

以下是同步获取网站页面数据的方法。这将帮助我构建我的 Web 自动化 API。特别感谢@Noseratio他帮助我找到了这个完美的答案。

private static string _pageData = "";
public static void MyFunction(string url)
{
    var th = new Thread(() =>
    {
        var br = new WebBrowser();
        br.DocumentCompleted += PageLoaded;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
    while (th.IsAlive)
    {
    }
    MessageBox.Show(_pageData);
}
static void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var br = sender as WebBrowser;
    if (br.Url == e.Url)
    {
         _pageData = br.DocumentText;
        Application.ExitThread();   // Stops the thread
     }
    }
}