C# - 显示加载但未完成?

时间:2012-05-23 10:20:25

标签: c# .net loading

在我的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";

            }

        }

2 个答案:

答案 0 :(得分:1)

我建议使用Backgroundworker。 (有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)。轻松实现A同步操作。

答案 1 :(得分: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());
}