我正在使用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)
{
..
但老实说,我不确定上面代码是做什么的。我想要的是处理两个场景 - 从所有三个查询中收集结果并检查它。如果可能的话,因为它看起来就像我读到的那样,目前任何查询都返回不同于零的结果以停止进一步执行,因为有时候我只关心客户端是否使用任何产品,而没有多少每个产品。
答案 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
基础架构使用CancellationToken
和cancel the other outstanding queries。