所以我试图将我的同步方法变为asnych。设置是 - 我有一个方法,检查用户是否使用任何公司产品。我需要对每个产品进行不同的查询,所以我决定试着尝试asnych编程,因为我之前从未尝试过使用Task
和await
,可能这不是完美的情况。做到这一点。但是现在我已经改变了我的方法:
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}})?
答案 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}}属性