El método hace asíncrono a sí mismo.

async-await asynchronous c# html-agility-pack multithreading

Pregunta

Tengo un método como este:

public  List<List<string>>  GroupedNodes(string URL, params string[] XPathes)
{
    //Load HTML Source
    HtmlWeb loader = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL);

    //some other codes ...

    //Return result as a List of list
    return grouped;
}

Utilizo HtmlAgilityPack para obtener la fuente html de una url.

Pero cuando uso este método causa un programa de congelación .

Sé que puedo usar subprocesos múltiples cuando llamo a este método en UI PERO quiero escribir mi método de manera asincrónica y responsiva, y cuando lo usamos, funciona sin congelación.

Quiero decir que si alguien usa mi método y no sabe multihilo, quiero que su programa no se congele, en otras palabras, ¡no quiero llamar a mi método con un hilo o tarea!

Respuesta popular

Normalmente, la forma correcta sería usar equivalentes async de los métodos de IO que está usando (como Load() ). Pero HtmlAgilityPack no parece ser compatible con async (al menos no en su versión .Net 4.5).

Esto significa que la mejor opción es ejecutar su método en otro hilo y requerir que las personas que llaman usen async - await :

Por ejemplo, la implementación podría verse así:

private List<List<string>> GroupedNodes(string URL, params string[] XPathes)
{
    //Load HTML Source
    HtmlWeb loader = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = loader.Load(URL);

    //some other codes ...

    //Return result as a List of list
    return grouped;
}

public Task<List<List<string>>> GroupedNodesAsync(string URL, params string[] XPathes)
{
    return Task.Run(() => GroupedNodes(URL, XPathes));
}

Sin usar async - await , no hay una buena manera de hacer que su método no bloquee el hilo de llamada.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow