Tes*_*t45 2 c# task async-await
我收到以下异常:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at GoogleProducts.Program.<Main>d__0.MoveNext() in C:\Code\test\GoogleProducts\Program.cs:line 60
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at GoogleProducts.Program.<Main>(String[] args)
来源是:
private static async Task Main(string[] args)
{
var queries = new[]
{
"seico watch",
"citizen watch",
"orient watch",
"bulova watch",
"seagull watch",
"glashuette watch"
};
var client = new WebClient();
foreach (var query in queries)
{
var url = @"https://www.google.co.uk/search?tbm=shop&q=" + query;
var content = await client.DownloadStringTaskAsync(url);
var doc = new HtmlDocument();
doc.LoadHtml(content);
var linkedProducts = doc.DocumentNode.Descendants("a")
.Select(a => a.GetAttributeValue("href", null))
.Where(href => href.StartsWith(@"/shopping/product/"));
var productTasks = linkedProducts.Select(async linkedProduct =>
{
var productUrl = @"https://www.google.co.uk" + linkedProduct;
var productPage = await client.DownloadStringTaskAsync(productUrl);
var productDoc = new HtmlDocument();
productDoc.LoadHtml(productPage);
var productName = productDoc.DocumentNode.Descendants("title").FirstOrDefault()?.InnerText;
var sellersNodes = productDoc.DocumentNode.Descendants("tr")
.Where(tr => tr.GetAttributeValue("class", null) == "os-row");
var sellers = sellersNodes.Select(seller => new Seller
{
Name = seller.Descendants("a").First().InnerText,
Price = decimal.Parse(seller.Descendants("td").Last().InnerText.Substring(2))
}).ToArray();
return sellers.Any() ? new Product(sellers, productName) : null;
}).Where(product => product != null);
foreach (var productTask in productTasks)
{
var product = await productTask;
var result =
$"{product.Name}{Environment.NewLine}Best price: {product.BestPrice()}, from {product.BestPriceSellers()}"
+ $", Average price: {product.AveragePrice()}";
Console.WriteLine(result + Environment.NewLine);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有更多详细信息,则无法发布。
您正在执行 的).Where(product => product != null);列表Task<Product>,而不是Product。
因此,即使 Product 为 null,Task<Product>也不是。
为了更好地查看它,请指定类型:
.Where((Task<Product> product) => product != null);
Run Code Online (Sandbox Code Playgroud)
这应该编译并向您展示错误的命名如何欺骗您。
| 归档时间: |
|
| 查看次数: |
1861 次 |
| 最近记录: |