3

在我的 C# 应用程序中,我通过读取 HTML 页面并解析其中的一些链接并将它们放入richTextBox(现在)来启动程序。但问题是,因为它必须读取链接需要一些时间,所以当我启动程序时,大约需要 5 秒才能显示表单。我想做的是立即显示表单,并显示加载光标或禁用的richTextBox。我该怎么做呢?这是发生的情况的示例:

public Intro()
        {
            InitializeComponent();
            WebClient wc = new WebClient();
            string source = wc.DownloadString("http://example.com");

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(source);
            var nodes = doc.DocumentNode.SelectNodes("//a[starts-with(@class, 'url')]");
            foreach (HtmlNode node in nodes)
            {
                HtmlAttribute att = node.Attributes["href"];
                richTextBox1.Text = richTextBox1.Text + att.Value + "\n";

            }

        }
4

2 回答 2

1

我建议使用Backgroundworker。(有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)。进行异步操作的简单方法。

于 2012-05-23T10:26:06.487 回答
1

好的,一点点(我希望它是正确的)示例如何使用任务并行库来完成它(什么?我喜欢它......)

public Intro()
{
    InitializeComponent();

    richTextBox1.IsEnabled = false;
    Task.Factory.StartNew( () =>
    {
       WebClient wc = new WebClient();
       string source = wc.DownloadString("http://example.com");

       HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
       doc.LoadHtml(source);
       var nodes = doc.DocumentNode.SelectNodes("//a[starts-with(@class, 'url')]");
       return nodes;
    }).ContinueWith( result =>
    {
      richTextBox1.IsEnabled = true;

      if (result.Exception != null) throw result.Exception;

      foreach (var node in result.Result)
      {
           HtmlAttribute att = node.Attributes["href"];
           richTextBox1.Text = richTextBox1.Text + att.Value + "\n";
      }

    }, TaskScheduler.FromCurrentSynchronizationContext());
}
于 2012-05-23T10:35:44.293 回答