Wait for an event to be triggered to continue the C #

-1

In the RealizarPesquisa method, when running the _WebBrowser.Navigate() line, the DocumentCompleted() event is triggered, but this event takes a while to execute, so the RealizarPesquisa method continues its process and when I go get the Document, it is coming null because eventoDocumentCompleted has not yet completed, I tried to use AutoResetEvent , but I did not succeed, does anyone have any suggestions?

    public class GoogleSearch
{
    private WebBrowser _WebBrowser;
    private string _TituloPesquisa;
    private string _LinkPesquisa;
    private List<GoogleResultado> _GoogleResultadoList;

    static AutoResetEvent aguardarDocumentCompleted = new AutoResetEvent(false);

    public GoogleSearch()
    {
        ConfigurarWebBrowser();
        _GoogleResultadoList = new List<GoogleResultado>();
    }

    public string GetResultJson 
    { 
        get
        {
            return _GoogleResultadoList.ToJsonSerialization<GoogleResultado>();
        }
    }

    public IEnumerable<GoogleResultado> GetListResults
    {
        get
        {
            return _GoogleResultadoList.ToList();
        }
    }

    public void Pesquisar(string textoConsulta)
    {
        RealizarPesquisa(textoConsulta);             
    }

    private void _WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        aguardarDocumentCompleted.Set();

        if (_WebBrowser.Document != null)
        {
            // Resultado em Html - Obter as Divs onde ficam o resultado da pesquisa do google.
            HtmlElementCollection divs = _WebBrowser.Document.GetElementsByTagName("div");

            // Obter dados da pesquisa.
            _TituloPesquisa = _WebBrowser.Document.Title;
            _LinkPesquisa = _WebBrowser.Document.Url.ToString();

            GoogleResultado resultado;
            foreach (HtmlElement x in divs)
            {
                // Div onde fica o resultado das pesquisas do google.
                if (x.GetAttribute("className") == "g")
                {
                    HtmlElement link = x.GetElementsByTagName("a")[0];
                    resultado = new GoogleResultado();
                    resultado.Titulo = link.InnerText;
                    resultado.Url = link.GetAttribute("href");
                    _GoogleResultadoList.Add(resultado);
                }
            }
        }           
    }

    private void ConfigurarWebBrowser()
    {
        _WebBrowser = new WebBrowser();
        _WebBrowser.DocumentCompleted += _WebBrowserDocumentCompleted;
        _WebBrowser.Url = new Uri("http://www.google.com.br", UriKind.Absolute);
    }

    private void RealizarPesquisa(string textoConsulta)
    {
        _WebBrowser.Navigate("https://www.google.com.br/search?num=100&q=" + textoConsulta);

        aguardarDocumentCompleted.WaitOne();

        var document = _WebBrowser.Document;
    }
}
    
asked by anonymous 14.07.2017 / 16:48

1 answer

0

You do this using AutoResetEvent , to wait for a response from the _WebBrowserDocumentCompleted method.

static AutoResetEvent esperar = new AutoResetEvent(true); //Instancia o AutoResetEvent

private void RealizarPesquisa(string textoConsulta)
{
    _WebBrowser.Navigate("https://www.google.com.br/search?num=100&q=" + textoConsulta);

    esperar.WaitOne(); //Faz esperar uma resposta para continuar executando

    var document = _WebBrowser.Document;

}

private void _WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    esperar.Set(); //Da a resposta para continuar executando
    if (_WebBrowser.Document != null)
    {
        //Minimizei o código aqui no exemplo para ficar mais fácil de ver
    }           
}

Do not forget to put:

using System.Threading;

See more about this in the official documentation >.

    
14.07.2017 / 16:59