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!
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.