Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# lambda表达式是多线程的吗?_C#_.net_Lambda_Parallel Processing - Fatal编程技术网

C# lambda表达式是多线程的吗?

C# lambda表达式是多线程的吗?,c#,.net,lambda,parallel-processing,C#,.net,Lambda,Parallel Processing,lambda表达式是多线程的吗 比如说,当你以lambda方法编写一个数学公式时,当你将它传递给另一个方法时,它会是多线程的吗?否,它们会在创建它们的线程上执行,除非你将它传递给另一个线程,就像任何其他方法一样。相信我,你不会希望它们自动运行在不同的线程上。lambda只是一个匿名方法,它会在调用它的任何线程上执行,除非你提供代码在单独的线程上执行。对你的要求不是100%清楚 您是否在询问lambda是否自然运行在不同的线程上? 如果不是,则它们只是System.Delegate的另一个实例,并

lambda表达式是多线程的吗


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

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

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

对你的要求不是100%清楚

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

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

您是否在询问它们在多线程上运行是否安全?


这是一个只有了解lambda表达式的内容才能回答的问题。它们并非天生的线程安全。根据我的经验,线程安全的可能性比您预期的要小得多

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

正如其他人所说,lambda表达式本身并不是多线程的,标准的linq-to-objects扩展方法也没有在单独的线程中调用它们

但是,如果您想进行一些类似linq的多线程编程,您应该查看。也请查看此链接:


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

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

  • 无法访问外部字段(简单的输入/输出方法)-此类方法始终是多线程的
  • 访问同步字段-考虑同步场景(<代码>监视器< /代码>类,读/写锁,<代码>联锁< /COD>访问,<代码> WaitHandle < /代码>等),最小化锁定冲突。
  • 访问捕获的变量(闭包)-确保只要其他线程使用它,捕获的变量就不会改变(如何访问变量:仅读取、读取和写入…)
C#编译器足够聪明,可以知道是为您的lambda生成静态方法还是实例方法。

答案可能令人困惑(但正确)。在一些常见的场景中,lambda可能在另一台机器上、在一种完全不同的运行时环境中执行,因此在另一个线程上执行,并且调用方不必等待远程执行完全完成后再继续


(特别是,如果您将其传递给Linq to SQL查询。)

那么,它位于您选择使用的任何线程上。。。不一定只有一个。而且我很确定它将纯粹是一个库,而不是一个C#特定的东西。是的,我可能应该说下一个版本的.net。抱歉,谢谢。当你说“什么使一个方法成为多线程的?”时,你的意思是这些指导原则使它在执行时是线程安全的还是多线程的?我的意思是多线程是线程安全的。如果一个方法(或lambda)是从不同的线程调用的,它将在每个线程中分别执行,即每个线程都有自己的调用堆栈。这一点很好,即使不是最直接和非本地的执行/主线程/当前线程/作为其代理的执行位置。迂腐地说:它是执行代理的线程(例如,在一个线程上创建,作为引用传递给另一个线程,并在那里执行委托)。