Ich habe eine Methode wie folgt:
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;
}
Ich benutze HtmlAgilityPack , um HTML-Quelle von einer URL zu bekommen.
Aber wenn ich diese Methode verwende, verursacht es ein Einfrierprogramm .
Ich weiß, dass ich Multithreading verwenden kann, wenn ich diese Methode in der Benutzeroberfläche anrufe, ABER ich möchte meine Methode so schreiben, dass sie asynchron und Responsive selbst ist und wenn wir sie verwenden, funktioniert sie ohne Einfrieren.
Ich meine, wenn jemand meine Methode benutzt und er Multithreading nicht kennt, möchte ich, dass sein Programm nicht einfriert, mit anderen Worten, ich möchte meine Methode nicht mit einem Thread oder einer Aufgabe aufrufen!
Normalerweise wäre der richtige Weg async
Äquivalente der verwendeten IO-Methoden (wie Load()
) zu verwenden. Aber HtmlAgilityPack scheint Async nicht zu unterstützen (zumindest nicht in seiner .Net 4.5-Version).
Das bedeutet , die beste Option ist Ihre Methode auf einem anderen Thread ausgeführt und Anrufer erfordern verwendet async
- await
:
Zum Beispiel könnte die Implementierung wie folgt aussehen:
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));
}
Ohne Verwendung von async
- await
, gibt es keine gute Möglichkeit, Ihre Methode den aufrufenden Thread nicht zu blockieren.