我正在学习如何使用MVC中的任务,我完全失去了。我需要从选定的网页下载源代码,找到一个元素,获取其值并返回它。而已。 为此,我使用HtmlAgilityPack和HttpClient来获取网页。 发生的问题是没有任何内容等待httpClient的响应,从而导致响应生成在Task仍在进行时完成。 (异步模块或处理程序完成异步操作仍未完成)ASP MVC4等待与httpclient
我读了很多线程在这里,codeproj和一些博客,仍然不明白是什么问题。最常见的解释是关于导致异步方法无效的类型,但我无法找到任何其他方式返回等待值,超过此:
public float ReadPrice(Uri url)
{
switch (url.Host)
{
case "www.host1.xy":
return ParseXYZAsync(url).Result;
default:
return float.Parse("99999,99");
}
}
private Task<float> ParseXYZAsync(Uri url)
{
loadPage(url);
var priceNode = document.DocumentNode.SelectSingleNode(
@"//*[@id='pageWrapper']/div[4]/section[1]/div[4]/div[1]/div[1]/span");
var price = priceNode.InnerText;
...
return priceInFloat;
}
private async Task LoadPage(Uri url)
{
HttpClient http = new HttpClient();
var response = await http.GetByteArrayAsync(url);
String source = Encoding.GetEncoding("utf-8")
.GetString(response, 0, response.Length - 1);
source = WebUtility.HtmlDecode(source);
document.LoadHtml(source);
}
谢谢你给出了一个惊人的答案,它解释了很多。这是否意味着只需要获取一个网页,我将需要两项任务?这就是为什么操作系统中有这么多人,当简单的事情需要超过一个。 – Vilo
@Vilo您需要的任务数量与您要创建的方法调用数量相同,因为异步会从调用堆栈的顶部到底部“一路”。 –
我发现另一个问题,当我将返回类型更改为任务时,标准同步流的某些内容正在调用此ParseWebsiteAsync()方法。它表示无法将任务转换为浮动。我需要这种方法(其中包含一个开关())是同步的。将异步添加到此方法将产生需要向上一个和另一个添加异步,直到我点击控制器将继续创建许多不同的任务。这个puropse有什么好的解决方案?我需要ParseWebsiteAsync返回一个浮点数(或父方法)。 –
Vilo