Пока запрос не имеет побочных эффектов (таких как выражения, вызывающие код, который вносит изменения), нет необходимости блокировать оператор LINQ.
В принципе, если вы этого не сделаетеизмените данные (и ничто другое не изменяет данные, которые вы используете), тогда вам не нужны блокировки.
Если вы используете .NET 4.0, и существует ConcurrentDictionary, который является потокобезопасным. Вот пример использования параллельного словаря (по общему признанию, не в выражении LINQ)
ОБНОВЛЕНИЕ
Если вы изменяете данные, тогда вам нужноиспользовать замки.Если два или более потоков попытаются получить доступ к заблокированному разделу кода, произойдет небольшая потеря производительности, поскольку один или несколько потоков ожидают снятия блокировки.ПРИМЕЧАНИЕ. Если вы перегружаете блокировку, то вы можете получить худшую производительность, чем если бы вы только что создали код с использованием последовательного алгоритма с самого начала.
Если вы только когда-либо читаете данные, то вы не 'не нужны блокировки, так как нет изменяемого общего состояния для защиты.
Если вы не используете блокировки, то вы можете столкнуться с периодически возникающими ошибками, когда данные не совсем верны или возникают исключения, когда возникают конфликты между читателями и писателями.По моему опыту, в большинстве случаев вы можете никогда не получить исключение, вы просто получаете поврежденные данные (за исключением того, что вы не обязательно знаете, что они повреждены).Вот еще один пример, показывающий , как данные могут быть повреждены, если вы не используете блокировки или не перепроектируете свой алгоритм, чтобы справиться с .
. Вы часто получаете максимум от системы, если учитываете ограниченияразвития в параллельной системе с самого начала.Иногда вы можете переписать свой код, чтобы он не использовал общие данные.Иногда вы можете разбить данные на куски и заставить каждый поток / задачу работать со своим собственным блоком, а затем в конце выполнить какой-нибудь процесс и снова сшить все вместе.