lambda表达式是多线程的吗?

时间:2009-03-17 20:50:20

标签: c# .net lambda parallel-processing

lambda表达式是多线程的吗?

当你把数学公式写成lambda方法时,当你把它传递给另一个方法时,它会是多线程的吗?

7 个答案:

答案 0 :(得分:13)

不是100%明确你的要求。

您是否在询问lambda是否自然地在不同的线程上运行?

如果不是这样,它们只是System.Delegate的另一个实例,并在主线程上运行,除非特别要求不这样做。

您是否在多线程上运行是否安全?

这个问题只能通过了解lambda表达式的内容来回答。它们本身并不是线程安全的。根据我的经验,线程安全的可能性远远低于您的预期。

答案 1 :(得分:6)

不,它们是在创建它们的线程上执行的,除非您将其传递给另一个线程,就像任何其他方法一样。您不希望它们自动在不同的线程上运行,相信我。

答案 2 :(得分:3)

在下一版本的C#中,他们正在向LINQ(称为PLINQ)和委托添加多线程选项。查看更多信息here。目前,它都在一个线程上。

答案 3 :(得分:3)

正如其他人所说,lambda表达式本身并不是多线程的,标准的linq-to-objects扩展方法也没有做任何特殊的事情来在不同的线程中调用它们。

但是,如果你想进行类似linq的多线程编程,你应该查看Parallel Extensions to .NET Framework。另请查看此链接:
http://blogs.msdn.com/pfxteam/

不幸的是,在VS2010 / .Net4.0出局之前,这不会是RTM。

答案 4 :(得分:2)

一个lambda只是一个匿名方法,它在被调用的任何线程上执行,除非你提供代码在一个单独的线程上执行。

答案 5 :(得分:2)

Lambda表达式就像其他任何方法一样。是什么让方法多线程?

  • 无法访问外部字段(简单的输入/输出方法) - 这种方法总是多线程的
  • 访问同步字段 - 考​​虑同步方案(Monitor类,读取器/写入器锁定,Interlocked访问,WaitHandle等),最大限度地减少锁定争用。
  • 访问捕获的变量(闭包) - 确保捕获的变量只要其他线程使用它就不会改变(访问变量的方式:只读,读,写......)

C#编译器足够聪明,可以知道是否为lambda生成了静态或实例方法。

答案 6 :(得分:2)

可能令人困惑(但却是真实的)答案。在一些常见的场景中,lambda可以在另一台机器上,在完全不同类型的运行时环境中执行,因此在另一个线程上执行,并且调用者不必在继续之前等待远程执行完全完成。

(具体来说,如果将其传递给Linq To SQL查询。)