在.NET中编写Async工作流的方法

时间:2014-06-03 07:24:59

标签: c# asynchronous

我在编写异步工作流程时遇到了一些麻烦。 这就是我所拥有的。 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;

2 个答案:

答案 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);
    }

}