2017-04-22 9 views
0

RichTextBoxをHTMLテキスト(HtmlAgilityPackで解析)でクロススレッドを更新するための拡張機能を書きました。今私はHTMLタグから取り除かれたプレーンテキストも必要とし、これは正確なinnerTextリターンです。C#Invoke、Delegateから文字列を返します

しかし、デリゲートからの返信方法も?

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

    } 
} 

ありがとうございます!

+1

呼び出しを()(文字列)にキャストし、値を返します。あなたは適切なデリゲート型を使用しなければなりません、 'Func 'はラムダ式を使って仕事を得ます:return(string)box.Invoke(new Func (()=> {AppendHTMLText(box、html) ;デッドロックを起こしにくく、UIスレッド上で継続する非同期/待機または小さなバックグラウンドタスクを優先します。 –

+0

@ハンス、ありがとう、私はすでにあなたが説明したものとまったく同じように考え出しました。努力をありがとう。 – orfruit

答えて

1

私はそれを次のように行います:

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); 
    } 
} 
関連する問題