在我的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";
}
}
答案 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());
}