如何使用ADO.NET ExecuteScalarAsync()在一个方法中异步执行三个独立的查询

本文关键字:执行 异步 三个 独立 查询 方法 何使用 ADO ExecuteScalarAsync 一个 NET | 更新日期: 2023-09-27 18:26:08

所以我试图将同步方法转换为asnych。设置是-我有一个方法来检查用户是否使用了公司的任何产品。我需要对每个产品进行不同的查询,所以我决定尝试一下asnych编程,因为我以前从未尝试过使用Taskawait,尽管这可能不是一个完美的情况。但现在我已经将我的方法改为:

    private static async Task<bool> isUsingProducts(int clientId)
    {
      bool hasProduct = false;
        using (SqlConnection connection1 = new SqlConnection(connString))
        {
            SqlCommand firstProduct = new SqlCommand(firstQuery, connection1);
            firstProduct.CommandTimeout = 300;
            firstProduct.Open();
            Task numberOfUsedProducts1 = firstProduct.ExecuteScalarAsync();
            //int numberOfUsedProducts = (int)firstProduct.ExecuteScalar();
            //if (0 < numberOfUsedProducts)
            //{
            //    hasProduct = true;
            //}
        }
        using (SqlConnection connection2 = new SqlConnection(connString))
        {
            SqlCommand secondProduct= new SqlCommand(secondQuery, connection2);
            secondProduct.CommandTimeout = 300;
            connection2.Open();
            Task numberOfUsedProducts2 = secondProduct.ExecuteScalarAsync();
            //int numberOfUsedProducts = (int)secondProduct.ExecuteScalar();
            //if (0 < numberOfUsedProducts)
            //{
            //    hasProduct = true;
            //}
        }
        return hasProduct;
    }

基本上,这是我尝试过的和以前同步方法留下的混合。在这种情况下,我只关心用户是否使用任何产品,所以我在每次查询结束后都会进行检查。然而,有时我需要实际的计数,所以最后我希望能够在asnych模式下执行查询,然后决定如何处理结果。

现在这个:

 Task numberOfUsedProducts2 = secondProduct.ExecuteScalarAsync();

并没有给我一个错误,但我不知道如何继续。我不知道如何添加逻辑来检查每个查询的结果(查询是同步的,我怎么知道已经有结果了),以及如何将这些结果转换为实际类型(int)?

如何使用ADO.NET ExecuteScalarAsync()在一个方法中异步执行三个独立的查询

ExecuteScalarAsync返回一个Task<object>。您可以将返回类型上的castawait:结合使用

int numberOfUsedProducts1 = (int) await firstProduct.ExecuteScalarAsync()
if (numberOfUsedProducts > 0)
{
     hasProduct = true;
}        

第二种方法也是如此。

现在这个:

 Task numberOfUsedProducts2 = secondProduct.ExecuteScalarAsync();

没有给我错误

这是因为Task<T>继承自Task,因此可以将其用作更抽象的基类,但随后会丢失包含返回的TResult属性