C# NET中异步工作流的组合方法

C# NET中异步工作流的组合方法,c#,asynchronous,C#,Asynchronous,我在编写异步工作流时遇到了一些麻烦。 这是我的。 有一个方法SearchForProducts()返回产品列表 此方法在其内部调用其他三个方法来执行如下操作: public List<Products> SearchForProducts(string Phrase, int Id) { var Products = new List<Products>(); var searchedProducts = SearchProducts(Phras

我在编写异步工作流时遇到了一些麻烦。 这是我的。 有一个方法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;
    }
提前谢谢

[更新]

经过搜索,我找到了这个有效的解决方案。 我为三个方法调用中的每一个都创建了一个任务,如下所示:

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);