0
J'ai écrit une extension pour cross thread mettre à jour un RichTextBox avec un texte HTML (analysé avec HtmlAgilityPack). Maintenant, j'ai aussi besoin de texte brut, dépouillé des balises HTML et c'est le retour exact de innerText.C# renvoie une chaîne à partir de Invoke, Delegate
Mais comment retourner du délégué?
public static string AppendHTMLText(this RichTextBoxEx box, string html)
{
// cross thread allowed
if (box.InvokeRequired)
{
box.Invoke((MethodInvoker)delegate()
{
return AppendHTMLText(box, html); // ???
});
}
else
{
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
//document.OptionFixNestedTags = false;
//document.OptionCheckSyntax = false;
//document.OptionWriteEmptyNodes = true;
document.LoadHtml(html);
HtmlAgilityPack.HtmlNode doc = document.DocumentNode.SelectSingleNode("/");
HtmlAgilityPack.HtmlNodeCollection nodes = doc.ChildNodes;
parseHTML(doc.ChildNodes, box);
return doc.InnerText;
}
}
}
Merci!
Invoke() renvoie la valeur, le jeter aux (string). Vous devez utiliser le type délégué approprié, 'Func' fait le travail avec une expression lambda: return (string) box.Invoke (nouveau Func (() => {return AppendHTMLText (box, html);})) ; Pas si joli et susceptible de blocage, privilégiez async/wait ou de petites tâches en arrière-plan qui continuent sur le fil de l'interface utilisateur. –
@Hans, merci, j'ai déjà compris exactement ce que vous avez expliqué. Merci pour l'effort. – orfruit