我使用以下代码下载HTML页面的源代码
String search = $"<search url>";
String result = "";
using (WebClient wc = new WebClient())
{
var searchURL = new Uri(search);
wc.DownloadStringCompleted += (s, e) =>
{
result = e.Result;
};
wc.DownloadStringAsync(searchURL);
}
return result.Trim();
这存在于静态方法
中public static Scrape(String arg)
一个Scraper类的。 但是,当我做的时候
txtResult.Text = Scraper.Scrape(arg);
在表单的代码中,没有任何内容出现。使用断点,我看到e.Result确实包含了预期的数据,但是发生了一些事情并且数据丢失了#34;在路上。任何人都知道我错过了什么;
答案 0 :(得分:3)
因为下载是异步的,所以在到达行返回“result.Trim()”之前没有更新结果的值,因此返回空字符串。
您需要等待WC完成,如果您使用任务方法,那么访问结果属性将导致您等待响应。
String search = $"<search url>";
String result = "";
using (WebClient wc = new WebClient())
{
var searchURL = new Uri(search);
result = wc.DownloadStringTaskAsync(searchURL).Result;
}
return result.Trim();
但是,如果您在当前方法中执行此操作,则最终会在前台线程上发生等待时挂起您的UI。
您可以通过更改通话来将更新移至后台,以便继续使用任务。
而不是
txtResult.Text = Scraper.Scrape(arg);
添加使用using System.Threading.Tasks;
然后你可以使用
行Task.Run(() => Scraper.Scrape(arg))
.ContinueWith(t => txtResult.Text = t.Result,
TaskScheduler.FromCurrentSynchronizationContext());
您可能还希望在其前面添加一行txtResult.Text = "Please Wait Fetching....";