2017-04-22 4 views
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!

+1

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

+0

@Hans, merci, j'ai déjà compris exactement ce que vous avez expliqué. Merci pour l'effort. – orfruit

Répondre

1

je le ferais de la façon suivante:

public static void AppendHTMLText(this RichTextBoxEx box, string html) 
{ 
    // use HtmlAgilityPack here 
    // ... 
    string text = doc.InnerText; 

    if (box.InvokeRequired) 
    { 
     box.Invoke((MethodInvoker)delegate() 
     { 
      box.AppendText(text); 
     }); 
    } 
    else 
    { 
     box.AppendText(text); 
    } 
}