如何对多个查询执行ExecuteScalarAsync并操作数据

时间:2014-10-10 13:00:22

标签: c# asynchronous ado.net

我正在使用ADO.NET并且在我的一个方法中,如果客户端使用任何公司产品,我需要返回布尔值。出于这个原因,我需要执行几个查询,因为不同的产品与客户端有不同的联合表,所以我最终得到这个:

SqlCommand firstProduct= new SqlCommand(firstQuery, connection);
                firstProduct.CommandTimeout = 300;
IAsyncResult numberOfUsedProducts = firstProduct.ExecuteScalarAsync();
//second product
SqlCommand secondProduct= new SqlCommand(secondQuery, connection);
                secondProduct.CommandTimeout = 300;
                IAsyncResult numberOfUsedProducts1 = secondProduct.ExecuteScalarAsync();
//third rpoduct
SqlCommand thirdProduct = new SqlCommand(thirdQuery, connection);
                thirdProduct.CommandTimeout = 300;
                IAsyncResult numberOfUsedProducts2 = thirdProduct .ExecuteScalarAsync();

基本上我想知道的是如何继续并从每个查询中收集结果,以便我可以执行一些额外的逻辑?

从我的调查中我发现我可以使用这样的东西:

WaitHandle waitHandle1 = firstProduct.AsyncWaitHandle;
WaitHandle waitHandle2 = secondProduct.AsyncWaitHandle;
WaitHandle waitHandle3 = thirdProduct.AsyncWaitHandle;

System.Threading.WaitHandle[] waitHandles = {
           waitHandle1, waitHandle2, waitHandle3
      };

然后

index = WaitHandle.WaitAny(waitHandles, 
                    60000, false);
switch (index)
               {
..

但老实说,我不确定上面代码是做什么的。我想要的是处理两个场景 - 从所有三个查询中收集结果并检查它。如果可能的话,因为它看起来就像我读到的那样,目前任何查询都返回不同于零的结果以停止进一步执行,因为有时候我只关心客户端是否使用任何产品,而没有多少每个产品。

1 个答案:

答案 0 :(得分:1)

您对IAsyncResult的使用已过时。 ExecuteScalarAsync会返回一个Task(实现IAsyncResult,但隐式地没有人使用它。)

下一个问题是您正在同时使用相同的连接,这是不允许的。您必须使用多个连接,或使用MARS并且非常小心您的线程。

您的代码可能应如下所示:

var results = await Task.WhenAll(firstProduct, ...);

You can add a timeout to this code as well.

如果您想在任何返回后立即停止所有其他查询,请使用Task.WhenAny基础架构使用CancellationTokencancel the other outstanding queries