6

lambda 表达式是多线程的吗?

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

4

7 回答 7

13

不是 100% 清楚你在问什么。

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

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

您是在问它们是否可以安全地在多个线程上运行?

这是一个只有知道 lambda 表达式的内容才能回答的问题。它们本质上不是线程安全的。根据我的经验,线程安全的可能性比您预期的要小得多。

于 2009-03-17T20:53:39.483 回答
6

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

于 2009-03-17T20:51:54.573 回答
3

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

于 2009-03-17T20:57:09.723 回答
3

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

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

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

于 2009-03-17T20:57:34.030 回答
2

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

于 2009-03-17T20:52:09.067 回答
2

Lambda 表达式和其他方法一样。是什么让方法成为多线程的?

  • 无法访问外部字段(简单的输入/输出方法)——这种方法总是多线程的
  • 访问同步字段 - 考​​虑同步场景(Monitor类、读/写锁、Interlocked访问WaitHandle等),尽量减少锁争用。
  • 访问捕获的变量(闭包)——确保捕获的变量只要其他线程使用它就不会改变(如何访问变量:只是读取、读取和写入......)

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

于 2009-03-17T21:01:00.697 回答
2

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

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

于 2009-03-17T21:09:27.447 回答