我正在學習如何使用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