我有一个服务,分批查询历史结果分贝。 批次基于开始时间和结束时间。所有批次之间的数据是相互排斥的,因此对于给定的一批批次,它们可以按任意顺序运行。有些批次可能需要更多时间才能执行。如果有任何批次失败,则整个过程中止/停止并记录错误。将数据返回给客户端时,需要合并来自所有批次的数据。
问题:
尽快将数据返回给客户端。
初步解决方案:
起初我是为了同步执行批次。这没有利用数据互斥的事实。初次使用后,发现此加载方法耗时过长。经过一些调试后,我发现导致速度慢的主要原因是sql查询的执行时间。因此,下一个解决方案是尝试使用BeginExecuteReader()
和EndExecuteReader()
异步执行每个批次。在异步调用所有批次后,该服务将在一个while循环中等待并每隔300ms轮询一次以检查是否有任何查询已完成。如果是,那么它会被读取。
int batchCount = 0, resultCount = 0;
List<AsyncDataResult> asyncCalls = new List<AsyncDataResult>();
while (true)
{
if (asyncCalls.Count == 0)
{
break;
}
if ((asyncCalls[resultCount]).AsyncResult.IsCompleted)
{
ReadAsyncResultsFromDb(asyncCalls[resultCount]);
asyncCalls.RemoveAt(resultCount);
}
resultCount++;
if (resultCount >= asyncCalls.Count)
{
resultCount = 0;
Thread.Sleep(300);
}
}
上述方法降低了装载时间对于大数据集,但对于非常小的数据集(但在许多批次),轮询被实际添加到装载延迟。
问:
- 如何异步执行的SQL,但不会做投票?
- 开始读取每批完成后?
更新: 对不起,但我忘了添加我需要返回的部分在调用异步调用相同的方法。原因是我需要填充的数据集作为参数传入此方法。从开始阅读器使用IAsyncCallback
将需要我改变整个班级。我希望我不会那样做。
哪.net框架4? – 2012-02-10 21:19:07
是的。它的.net 4.0 – EndlessSpace 2012-02-10 21:23:51