【发布时间】:2014-10-22 14:36:20
【问题描述】:
我有一个从另一个开发人员那里继承的 Windows 服务,它运行速度非常慢,并且对 eBay API 的调用很慢。我希望在不进行过多重构的情况下加快速度。
我刚刚开始研究使用 c# async/await 来尝试获取其中一些慢速调用来运行异步。 这是我想要实现的目标:
我有 1 个非常繁忙的方法,它会拨打很多电话,如下所示:
getProducts
getCategories
getVehicles
getImages
我的想法是,我可以简单地将方法更改为 async 并将 Task<T> 添加到返回类型,如下所示:
public async Task<String> ProcessAdditionalProductDetialsAsync(ItemType oItem)
{
String additionalProductDetails = string.Empty;
if (oItem.ItemSpecifics.Count > 0)
{
foreach (NameValueListType nvl in oItem.ItemSpecifics)
{
if (nvl.Value.Count > 0)
{
foreach (string s in nvl.Value)
{
additionalProductDetails += "<li><strong>" + nvl.Name + ":</strong> " + s + "</li>";
}
}
}
}
return additionalProductDetails;
}
然后用 await 调用它们:
Task<String> additionalProductDetials = ebayPartNumbers.ProcessAdditionalProductDetialsAsync(item);
Task<PartNumberCollection> partNumberCollection = ebayPartNumbers.ProcessPartNumbersAsync(item);
await Task.WhenAll(partNumberCollection, additionalProductDetials);
如何获取返回的类型以便使用它们?我试过只使用partNumberCollection,但它只有await 可用的属性。
【问题讨论】:
-
编译器应该警告你在
ProcessAdditionalProductDetialsAsync中使用async而不使用await。这是您的实际代码还是真的在做await? eBay API 从何而来? -
是的,编译器确实警告该方法没有等待,但等待在父方法中。
-
你应该注意编译器警告;如果是
async,在那个方法中应该有一个await。如果要在后台线程上执行代码,请使用Task.Run;如果你想做 I/O(即 eBay API),它应该使用自然异步方法。
标签: c# async-await