Являются ли лямбда-выражения многопоточными? - PullRequest
5 голосов
/ 17 марта 2009

Являются ли лямбда-выражения многопоточными?

Скажите, когда вы пишете математическую формулу как лямбда-метод, когда вы передаете ее другому методу, будет ли она многопоточной?

Ответы [ 7 ]

13 голосов
/ 17 марта 2009

Не на 100% ясно, о чем вы спрашиваете.

Вы спрашиваете, работают ли лямбды в другом потоке?

Если нет, то это просто еще один экземпляр System.Delegate, который запускается в главном потоке, если не указано иное.

Вы спрашиваете, безопасны ли они для работы в нескольких потоках?

На этот вопрос можно ответить только зная содержание лямбда-выражения. Они по своей природе не являются поточно-ориентированными. По моему опыту гораздо менее вероятно, что потокобезопасен, чем вы ожидаете.

6 голосов
/ 17 марта 2009

Нет, они выполняются в потоке, в котором они созданы, если вы не передадите его в другой поток, как любой другой метод. Вы бы не хотели, чтобы они автоматически запускались в другом потоке, поверьте мне.

3 голосов
/ 17 марта 2009

Как уже говорили другие, лямбда-выражения не являются многопоточными, и стандартные методы расширения linq-to-objects не делают ничего особенного, чтобы вызывать их в отдельных потоках.

Однако, если вы хотите выполнить какое-нибудь linq-подобное многопоточное программирование, вам следует проверить Параллельные расширения для .NET Framework . Также проверьте эту ссылку:
http://blogs.msdn.com/pfxteam/

К сожалению, это не будет RTM до выхода VS2010 / .Net4.0.

3 голосов
/ 17 марта 2009

В следующей версии C # они добавляют опции многопоточности для LINQ (называемых PLINQ) и делегатов. Проверьте больше информации здесь . В настоящее время все это в одной теме.

2 голосов
/ 18 марта 2009

Потенциально запутанный (но верный) ответ. В некоторых часто встречающихся сценариях лямбда может выполняться на другом компьютере, в совершенно другой среде времени выполнения, и, следовательно, в другом потоке, и вызывающая сторона не обязательно должна ожидать завершения удаленного выполнения, прежде чем продолжить.

(В частности, если вы передадите его в запрос Linq To SQL.)

2 голосов
/ 18 марта 2009

Лямбда-выражения - это просто методы, как и любые другие. Что делает метод многопоточным?

  • Нет доступа к внешним полям (простой метод ввода / вывода) - такой метод всегда многопоточный
  • Доступ к синхронизированному полю - рассмотрите сценарий синхронизации (класс Monitor, блокировка чтения / записи, Interlocked доступ, WaitHandle и т. Д.), Минимизируйте количество блокировок.
  • Доступ к захваченной переменной (замыкание) - убедитесь, что захваченная переменная не изменяется, пока другие потоки ее используют (как к переменной обращаются: просто читает, читает и пишет ...)

Компилятор C # достаточно умен, чтобы знать, генерируются ли статические методы или методы экземпляра для ваших лямбд.

2 голосов
/ 17 марта 2009

Ну, лямбда - это просто анонимный метод, он выполняется в любом потоке, к которому он вызывается, если вы не предоставите код для выполнения в отдельном потоке.

...