【发布时间】:2009-03-17 20:50:20
【问题描述】:
lambda 表达式是多线程的吗?
说当你把一个数学公式写成一个 lambda 方法时,当你把它传递给另一个方法时,它会是多线程的吗?
【问题讨论】:
标签: c# .net lambda parallel-processing
lambda 表达式是多线程的吗?
说当你把一个数学公式写成一个 lambda 方法时,当你把它传递给另一个方法时,它会是多线程的吗?
【问题讨论】:
标签: c# .net lambda parallel-processing
不是 100% 清楚你在问什么。
您是在问 lambdas 是否自然地在不同的线程上运行?
如果不是,它们只是 System.Delegate 的另一个实例,并在主线程上运行,除非特别要求这样做。
您是在询问它们是否可以安全地在多个线程上运行?
这是一个只有知道 lambda 表达式的内容才能回答的问题。它们本质上不是线程安全的。根据我的经验,线程安全的可能性比您预期的要小得多。
【讨论】:
不,它们在创建它们的线程上执行,除非你将它传递给另一个线程,就像任何其他方法一样。你不会希望它们自动在不同的线程上运行,相信我。
【讨论】:
在下一版本的 C# 中,他们正在向 LINQ(称为 PLINQ)和委托添加多线程选项。查看更多信息here。目前,这一切都在一个线程上。
【讨论】:
正如其他人所说,lambda 表达式本质上不是多线程的,标准的 linq-to-objects 扩展方法也没有做任何特殊的事情来在单独的线程中调用它们。
但是,如果你想做一些类似 linq 的多线程编程,你应该查看Parallel Extensions to .NET Framework。另请查看此链接:
http://blogs.msdn.com/pfxteam/
不幸的是,在 VS2010/.Net4.0 出来之前,这不会是 RTM。
【讨论】:
嗯,lambda 只是一个匿名方法,它在调用它的任何线程上执行,除非您提供在单独线程上执行的代码。
【讨论】:
Lambda 表达式和其他方法一样。是什么让方法成为多线程的?
Monitor 类、读/写锁、Interlocked 访问、WaitHandle 等),尽量减少锁争用。C# 编译器足够聪明,可以知道是为您的 lambda 生成静态方法还是实例方法。
【讨论】:
可能令人困惑(但真实)的答案。在一些常见的场景中,lambda 可能在另一台机器上执行,在完全不同类型的运行时环境中,因此在另一个线程上,调用者不必等待远程执行完全完成才能继续。
(特别是,如果您将其传递给 Linq To SQL 查询。)
【讨论】: