2016-06-08 65 views
0

我在這裏獲得了我的記錄。如何在並行循環中從IQueryable中獲取元素

IQueryable<EmployeeItem> dtEmployee = GetAll(); 

之後,那個循環dtEmployee

這是我正常的循環工作正常。

for (int i = 0; i < dtEmployee.Count(); i++) 
{ 
    var drEmployee = dtEmployee.AsEnumerable().ElementAt(i); 
} 

這是我想嘗試的並聯循環。

System.Threading.Tasks.Parallel.For(0, dtEmployee.Count(), i => { 
    var drEmployee = dtEmployee.AsEnumerable().ElementAt(i); 
}); 

我沒有任何編譯錯誤,但是當我在Visual Studio中運行它,我得到這個錯誤:

screen shot

+0

我不使用所提供的鏈接中的任何圖片。順便說一句,你的動機是什麼?它不會加速任何事情。而且你多次調用AsEnumerable()方法。用.ToList()實現IQueryable() –

+0

你可以檢查whitch變量是否爲空? – llouk

+0

嘗試更改變量名稱'var drEmployee'爲其他內容 –

回答

0

This is my normal loop which is working fine.

我不會說很好,這是令人難以置信的低效率。由於dtEmployee代表查詢AsEnumerable()意味着它不再是數據庫查詢,只是一個懶惰序列,每個ElementAt()(以及Count())都會導致單獨的數據庫查詢,這可能會檢索所有員工。

爲了解決這個問題,使用foreach

foreach (var drEmployee in dtEmployee) 
{ 
} 

This is the parallel loop that I want to try.

由於dtEmployee不是線程安全的,從多個線程在同一時間,你不能訪問它。這裏的修正實際上是相當多的與上面相同:使用Parallel.ForEach()

Parallel.ForEach(dtEmployee, drEmployee => { 
}); 
+0

您好@svick,當然,我會先嚐試一下。 – Smith

相關問題