C# NET中异步工作流的组合方法
我在编写异步工作流时遇到了一些麻烦。 这是我的。 有一个方法SearchForProducts()返回产品列表 此方法在其内部调用其他三个方法来执行如下操作:C# NET中异步工作流的组合方法,c#,asynchronous,C#,Asynchronous,我在编写异步工作流时遇到了一些麻烦。 这是我的。 有一个方法SearchForProducts()返回产品列表 此方法在其内部调用其他三个方法来执行如下操作: public List<Products> SearchForProducts(string Phrase, int Id) { var Products = new List<Products>(); var searchedProducts = SearchProducts(Phras
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;
}
提前谢谢
[更新]
经过搜索,我找到了这个有效的解决方案。
我为三个方法调用中的每一个都创建了一个任务,如下所示:
var searchProductsTask = new Task<List<Product>>(() => SearchProducts(Phrase));
按如下方式开始每个任务:
searchProductsTask.Start();
直到其中一项完成:
Task.WaitAll(tasksList);
在需要结果的特定任务上调用.Result
var searchedProducts = searchProductsTask.Result;
我不是专家,但是您的第一个方法不是异步的,所以它不等待结果,所以您必须通过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);
}
}
public async void SearchProducts(字符串短语,int-id)
{
var Products=新列表();
尝试
{
Products=wait_context.Database.SqlQuery(“EXEC Search_Products@pharse”,
新的SqlParameter(“pharse”,短语)).ToList();,
var searchedProducts=SearchProducts(短语);
var sellingPrice=GetSellingPrice(Id);
var折扣=获取折扣(Id);
产品=搜索产品;
产品=过程销售价格(产品,销售价格);
产品=折扣过程(产品、折扣、Id);
调用您想要的产品(产品)的任何方法;
}
}
您需要更改SearchProducts
方法以调用ToListSync()
我认为您得到的最大提示是“异步方法的返回类型必须是void、Task或Task”。试着从那里思考一下。异步void??这不是一个好主意:我只是对给定的错误进行响应;)我会使用BackgroundWorker tbh
searchProductsTask.Start();
Task.WaitAll(tasksList);
var searchedProducts = searchProductsTask.Result;
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);
}
}
Products = await _context.Database.SqlQuery<Products>("EXEC Search_Products @pharse",
new SqlParameter("pharse", Phrase)).ToListAsync();
Products = await searchedProducts;
Products = ProcessForSellingPrice(Products, await sellingPrice);
Products = ProcessForDiscounts(Products, await discounts, Id);