我在编写异步工作流程时遇到了一些麻烦。 这就是我所拥有的。 SearchForProducts()有一个返回产品列表的方法 这个方法调用其中的三个其他方法来完成它的工作:
public List<Products> SearchForProducts(string Phrase, int Id)
{
var Products = new List<Products>();
var searchedProducts = SearchProducts(Phrase);
var sellingPrice = GetSellingPrice(Id);
var discounts = GetDiscounts(Id);
Products = searchedProducts;
Products = ProcessForSellingPrice(Products, sellingPrice);
Products = ProcessForDiscounts(Products, discounts, Id);
return Products;
}
所有三个SearchProducts,GetSellingPrice&amp; GetDiscounts在执行存储过程后返回产品列表。 我尝试在其中一个上使用异步关键字并等待结果如下:
public async List<Products> SearchProducts(string Phrase)
{
var Products = new List<Products>();
try
{
Products = await _context.Database.SqlQuery<Products>("EXEC Search_Products @pharse",
new SqlParameter("pharse", Phrase)).ToList();,
}
return Products;
}
这会出现以下错误:
Cannot await 'System.Collections.Generic.List<Products>'
The return type of an async method must be void, Task or Task<T>
GetSellingPrice,&amp; GetDiscounts也有相同的实现,它们调用不同的存储过程。
如何制作SearchProducts,GetSellingPrice和&amp; GetDiscounts async,以便三次执行后的结果可以传递给这些方法:
Products = searchedProducts;
Products = ProcessForSellingPrice(Products, sellingPrice);
Products = ProcessForDiscounts(Products, discounts, Id);
提前致谢。
[UPDATE]
搜索后我发现这个解决方案有效。 我为三个方法调用中的每一个创建了一个任务,如下所示:
var searchProductsTask = new Task<List<Product>>(() => SearchProducts(Phrase));
为所有任务创建一个数组:
var tasksList = new Task[] {searchProductsTask, 2ndTask, 3rdTask }
开始执行每项任务:
searchProductsTask.Start();
等待他们完成:
Task.WaitAll(tasksList);
在需要结果的特定任务上调用.Result
var searchedProducts = searchProductsTask.Result;
答案 0 :(得分:1)
您需要更改SearchProducts
方法以致电ToListAsync()
Products = await _context.Database.SqlQuery<Products>("EXEC Search_Products @pharse",
new SqlParameter("pharse", Phrase)).ToListAsync();
对所有其他方法执行此操作后,您应该只能await
结果
Products = await searchedProducts;
Products = ProcessForSellingPrice(Products, await sellingPrice);
Products = ProcessForDiscounts(Products, await discounts, Id);
答案 1 :(得分:0)
我不是专家,但你的第一个方法不是异步,所以它不等待结果所以你必须传递void。例如这样的事情:
public async void SearchProducts(string Phrase, int id)
{
var Products = new List<Products>();
try
{
Products = await _context.Database.SqlQuery<Products>("EXEC Search_Products @pharse",
new SqlParameter("pharse", Phrase)).ToList();,
var searchedProducts = SearchProducts(Phrase);
var sellingPrice = GetSellingPrice(Id);
var discounts = GetDiscounts(Id);
Products = searchedProducts;
Products = ProcessForSellingPrice(Products, sellingPrice);
Products = ProcessForDiscounts(Products, discounts, Id);
CallWhateverMethodYouWantForProduct(Products);
}
}