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

时间:2014-10-10 14:15:40

标签: c# asynchronous ado.net task

所以我试图将我的同步方法变为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();

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

1 个答案:

答案 0 :(得分:1)

ExecuteScalarAsync返回Task<object>。您可以在返回类型上使用cast并结合await

int numberOfUsedProducts1 = (int) await firstProduct.ExecuteScalarAsync()

if (numberOfUsedProducts > 0)
{
     hasProduct = true;
}        

第二种方法也是如此。

  

现在这个:

 Task numberOfUsedProducts2 = secondProduct.ExecuteScalarAsync();
  

没有给我一个错误

那是因为Task<T>继承自Task,因此您可以将其用作抽象程度更高的基类,但是您丢失了包含返回的Result的{​​{1}}属性