3

私の C# アプリケーションでは、HTML ページを読み取り、そこからいくつかのリンクを解析して、(今のところ) richTextBox に配置することで、プログラムを開始します。しかし、問題は、リンクを読み取る必要があるため、時間がかかることです。そのため、プログラムを開始すると、フォームが表示されるまでに約 5 秒かかります。私がやりたいことは、すぐにフォームを表示し、読み込み中のカーソルまたは無効なリッチテキスト ボックスを表示することです。どうすればそれを行うことができますか?何が起こるかのサンプルを次に示します。

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

わかりました、少し (すべて正しいといいのですが) Task Parallel Library でどのようにそれを行うことができるかのサンプル (なに? 私はそれが好きです...)

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 に答える
1

Backgroundworker を使用することをお勧めします。(詳細については、 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspxを参照してください)。A-sync 操作を行う簡単な方法。

于 2012-05-23T10:26:06.487 に答える