Rendre la méthode asynchrone elle-même

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

Question

J'ai une méthode comme celle-ci:

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;
}

J'utilise HtmlAgilityPack pour obtenir une source HTML à partir d'une URL.

Mais lorsque j'utilise cette méthode, le programme est bloqué .

Je sais que je peux utiliser le multithreading lorsque j'appelle cette méthode dans l'interface utilisateur MAIS je veux écrire ma méthode de manière à être asynchrone et réactive elle - même et lorsque nous l'utilisons, cela fonctionne sans gel.

Je veux dire si quelqu'un utilise ma méthode et qu'il / elle ne connaît pas le multithreading, je souhaite que son programme ne soit pas figé. En d'autres termes, je ne souhaite pas appeler ma méthode avec un fil ou une tâche!

Réponse populaire

Normalement, la bonne façon consiste à utiliser des équivalents async des méthodes IO que vous utilisez (comme Load() ). Mais HtmlAgilityPack ne semble pas prendre en charge async (du moins pas dans sa version .Net 4.5).

Cela signifie que la meilleure option consiste à exécuter votre méthode sur un autre thread et à obliger les appelants à utiliser async - await :

Par exemple, l'implémentation pourrait ressembler à ceci:

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));
}

Sans utiliser async - await , il n’existe aucun moyen efficace d’empêcher votre méthode de bloquer le thread appelant.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi