2011-10-21 53 views
1

我使用LINQ到對象,我發現.ToList和.ToArray操作阻塞了線程。 (在性能報告中,我看到了阻塞的時間。)我想這是因爲GC在嘗試調用tolist或toarray時試圖分配內存。這很糟糕,因爲我在並行循環中使用linq,並且希望訪問linq中的一些共享集合。 有沒有辦法解決這個問題,除非不使用linq來反對?會LINQ到對象阻塞線程?

+1

你有什麼具體的具體例子嗎?特別是通過線程理解,細節非常重要。 –

+0

另請參見:數據有多大 –

+0

'我在並行循環中使用linq':你的意思是說你正在使用PLinq? – phoog

回答

3

調用ToListToArray會導致查詢立即得到評估 - 這將阻止它們被調用的線程,直到整個集合被評估並返回查詢結果。

您應該直接迭代查詢而不調用任何一種方法 - 這會將結果以流的形式(假設沒有其他渴望的評估發生)。

我建議你看看Task Parallel Library(TPL)如果你需要做同時工作。

+0

謝謝。我按照你的建議進行迭代。現在爭用時間將變爲:-System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext() --ConsoleApplication3.Module1._Lambda $ __ 7(class VB $ AnonymousType_0'2 ,類ConsoleApplication3.Module1/ClassC) --- JIT_NewFast(struct CORINFO_CLASS_STRUCT_ *)。有任何想法嗎? – orange

+0

最後我得到了答案。我需要做的唯一事情就是將GC轉換爲服務器模式。 – orange