2017-04-22 138 views
0

返回一個字符串,我寫了跨線程更新一個擴展了的HTML文本(與HtmlAgilityPack解析)一個RichTextBox。現在我也需要純文本,從HTML標籤剝離,這是確切的innerText返回。C#從調用,委託

但是如何從委託返回呢?

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鍵'得到了lambda表達式完成任務:回報(字符串)box.Invoke(新Func鍵(()=> {返回AppendHTMLText(盒,HTML);})) ;如果不是那麼漂亮並且容易陷入僵局,那麼請支持在UI線程上繼續執行的異步/等待或小型後臺任務。 –

+0

@Hans,謝謝你,我已經完全按照你所解釋的那樣計算出來了。感謝您的努力。 – 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); 
    } 
}