gpt4 book ai didi

multithreading - IEnumerable 来自方法和延迟执行的结果

转载 作者:行者123 更新时间:2023-12-02 16:02:55 25 4
gpt4 key购买 nike

我理解 LINQ 中的延迟执行,如下所述: What are the benefits of a Deferred Execution in LINQ?

但是,延迟执行可能会导致错误,尤其是在多线程场景中,例如。在锁之外的共享集合上执行评估。当返回延迟计算的方法嵌套在多个方法层深处时,(至少对我来说)很难记住或跟踪以便正确锁定。

忽略无限序列(例如斐波那契)等特殊情况,并假设集合的过滤被认为是完整的(即消费者不太可能进一步过滤结果),什么将被认为是“最佳方法” “当从方法返回 IEnumerable 集合时——它应该已经被评估还是延迟?

注意:“最佳方法”可以根据其他一些措施的效率/代码安全性来定义,只需在您的响应中进行验证即可。我想知道社区是如何做到这一点的。

后续问题:如果结果被评估或延迟,在方法名称中显式声明是否有意义?

最佳答案

您将编写的大部分代码都不是多线程的。事实上,当你想要急切地评估一个可枚举值时,我能想到的只有三个原因:

  1. 您在多线程环境中需要它。您应该将其设为列表或数组。
  2. 您想要随机访问可枚举值。您应该将其设为列表或数组。
  3. 您希望控制评估的时间(例如评估是否昂贵)。

在其他时候,您应该让它使用延迟执行。这会将评估推迟到实际需要的时间点,并且可能会更快,具体取决于您应用的过滤器。例如,bigquery.First()可能比 bigquery.ToArray().First() 更快。您能否确定用户已完成过滤?

此外,运行时 will optimize certain LINQ queries 。这个例子取自Jon Skeet的文章 LINQ To Objects and the performance of nested "Where" calls :

// Normal LINQ query
var query = list.Where(x => Condition1(x))
.Where(x => Condition2(x))
.Select(x => Projection1(x))
.Select(y => Projection2(y));

// After optimization
var query = list.WhereSelect(x => Condition1(x) && Condition2(x),
x => Projection2(Projection1(x));
<小时/>

顺便说一句,您的方法应该返回它们可以返回的最具体的可见类型。例如,处理 T[] 的方法数组或 List<T>内部列表通常不应仅返回 IEnumerable<T> 。如果您希望结果不可变,请将其包装在 ReadOnlyCollection<T> 中相反。

关于multithreading - IEnumerable<T> 来自方法和延迟执行的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528995/

25 4 0