我有一個服務,分批查詢歷史結果分貝。 批次基於開始時間和結束時間。所有批次之間的數據是相互排斥的,因此對於給定的一批批次,它們可以按任意順序運行。有些批次可能需要更多時間才能執行。如果有任何批次失敗,則整個過程中止/停止並記錄錯誤。將數據返回給客戶端時,需要合併來自所有批次的數據。
問題:
儘快將數據返回給客戶端。
初步解決方案:
起初我是爲了同步執行批次。這沒有利用數據互斥的事實。初次使用後,發現此加載方法耗時過長。經過一些調試後,我發現導致速度慢的主要原因是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