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

C#-未完成时显示加载?,c#,.net,loading,C#,.net,Loading,在我的C#应用程序中,我通过读取一个HTML页面并解析其中的一些链接并将它们放入richTextBox(目前)来启动程序。但问题是,因为它必须读取链接,所以需要一些时间,所以当我启动程序时,在显示表单之前大约需要5秒钟。我想做的是立即显示表单,并显示加载光标或禁用的richTextBox。我该怎么做呢?以下是发生的情况的示例: public Intro() { InitializeComponent(); WebClient wc

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

            }

        }

我建议使用后台工作人员。(有关详细信息,请参见)。执行A-sync操作的简单方法。

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


在单独的线程中执行此操作。请确保使用正确的调用方法等。您可以使用或1。禁用UI线程2上的框。在单独的线程3中启动“长时间运行任务”。工作完成后,重新启用并填充UI线程中的框。您还可以使用WebClient.DownloadStringAsync方法在单独的线程中下载字符串。然后使用BackgroundWorker进行解析(我第一次读到时错过了这一点)-很好地使用了同步上下文返回到UI线程:)谢谢。我刚刚写了一个回复,我想我从CurrentSynchronizationContext中得到的
有点错误。
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());
}