2016-07-27 117 views
0

我正在通過一組數據(以下查詢的示例)進行分頁以驗證某些信息。當我使用Parallel.ForEach時,獲取第二頁結果的SQL命令將回到空白。如果我在返回語句中斷並將活動行移回存儲庫,它將返回我正在查找的結果。將Parallel.ForEach更改爲標準C#foreach按預期工作。查詢Parallel.ForEach導致SQL查詢不起作用

例子:代碼

SELECT TOP 500 
     StudentID, 
     StudentName 
    FROM Student 
    WHERE StudentVerified IS NULL 

例...

while(true) 
{ 
    using(var rep = new Repository()) 
    { 
     var students = rep.GetStudents(); 
     if (students.Length == 0) return false; 
     Parallel.ForEach(students, (student) => 
     { 
      rep.StudentVerified(student.StudentID, true); 
     }); 
    } 
} 

任何幫助弄清楚爲什麼結果的第二頁是回來空表示讚賞。謝謝。

+2

很可能'Repository.StudentVerified'不是線程安全的。你需要顯示它的代碼。 –

+0

這是一個簡單的SQL UPDATE語句。但是,如果線程安全或不是線程安全,SELECT命令仍應返回數據或應該有例外。沒有結果肯定是不期望的。 – Brian

+2

_「將Parallel.ForEach更改爲標準C#foreach可按預期工作」_作爲Scott的後續工作,在選項中將MaxDegreeOfParallelism設置爲1(僅僅是爲了它)可能會導致它工作太。因此,問題不在於「Parallel.ForEach導致SQL查詢無法正常工作」,而是您的代碼可能不是線程安全的。如果'Repository.StudentVerified'全部共享同一個數據庫連接,那麼這也許是你的問題。同樣適用於EF – MickyD

回答

1

根據您的意見,您似乎在請求之間共享SqlConnection。該類不是線程安全的。 SqlConnection is optimised to have many short lived connections,根據需要創建連接,然後在完成後使用using塊進行處理。

+0

我試圖更好地理解問題。你有什麼想法爲什麼它默默地失敗?或者爲什麼在Parallel.ForEach之外的代碼失敗,而不是代碼裏面的代碼呢?這種行爲似乎完全違反了我的直覺。 – Brian