【问题标题】:Force Linq to not delay execution强制 Linq 不延迟执行
【发布时间】:2009-06-30 14:38:26
【问题描述】:

其实这和这个帖子是同一个问题:

How can I make sure my LINQ queries execute when called in my DAL, not in a delayed fashion?

但由于他没有解释为什么他想要它,这个问题似乎已经被忽略了一点。这是我的类似但更好解释的问题:

我有两种类型的少量线程(暂时忽略 UI 线程)。有一个“数据收集”线程类型和一个“计算”线程类型。数据收集线程很慢。有相当多的数据需要从各个地方进行筛选。计算线程相对较快。到目前为止的设计模型是发送数据收集线程以查找数据,并在完成后将数据传递给计算。

当我在 Linq 中对我的数据收集进行编码时,我最终将一些缓慢的返回到我的计算线程中。现在有一些数据元素在计算过程中使用之前无法完全解析——这是一个问题。

我想强制 Linq 在给定时间完成它的工作(语句结束?方法结束?“请结束,该死”方法调用),这样我就知道我以后不会为此付费.将“.ToList()”添加到 Linq 的末尾是 1. 尴尬,2. 感觉就像装箱的东西,无论如何都要在另一个线程中拆箱。

【问题讨论】:

  • 记住:查询理解的值是一个代表查询本身的对象,而不是它的结果。如果您想要结果的快照,您将不得不以某种方式询问查询对象(然后忍受在您使用它们时它们可能已经过时的事实。)“ToList”似乎是最简单的方法。

标签: c# linq delayed-execution


【解决方案1】:

你不会对任何东西进行装箱 - 你会缓冲结果。

如果您真的想要数据,基本上可以使用ToList()。除非您准备好立即使用数据,否则它必须在某处进行缓冲,不是吗?列表只是一种方便的方式。

另一种方法是同时进行处理 - 急切地使用生成的数据。我没有完全遵循不同的线程方面,所以我不清楚这是否会对你有所帮助,但据我所知,这些基本上是你可用的选择。

这实际上在您的描述中有点明确:

到目前为止的设计模型是 将数据收集线程发送到 查找数据,以及何时完成 将数据传递给计算。

调用ToList() 基本上会将您返回的内容从“一个可以在被要求时获取数据的查询”更改为“数据本身,缓冲在一个列表中”。

【讨论】:

  • 或者对结果调用任何方法,例如 Count(),应该做同样的事情...
  • 这将强制对其进行评估,但否则数据将再次丢失 - 如果原始查询随后被传回,它将再次被评估,可能会很慢。
  • @GalacticCowboy:调用像 Count 这样的方法会缓冲结果,但随后它们会被丢弃,您将只剩下计数而没有数据:(
  • @clintp:我强烈怀疑您仍在寻找无法完成的事情,根据您在此处的描述。当您从计算线程中使用信息时,您希望信息立即可用,但您不希望在数据读取线程中获取信息和处理它的时间之间存储它。不储存,你怎么指望能很快再拿回来?
  • @TimSchmelter:在没有上下文的情况下回答这样的一般性问题有点困难 :) 值得注意的是,您在该问题中所做的基本上是一个坏主意 - 查询不应该有副作用。如果您没有在查询中添加副作用,那么您就不会遇到问题...
【解决方案2】:

你能解释一下为什么 .ToList 是不可接受的吗?您提到了装箱和拆箱,但这些是完全不相关的主题。

强制 LINQ 查询按需完成的一部分需要存储结果。否则,为了再次查看结果,您必须重新处理查询。 .ToList 通过将元素存储在List<T> 中有效地实现了这一点。

几乎可以将元素存储在任何其他集合样式的数据结构中,并进行各种权衡,以更好地满足您的需求。

【讨论】:

  • 仔细阅读。它感觉就像装箱/拆箱。称它为“封装”,或“礼品包装”,或其他。
  • @clintp,对不起,我觉得这些比较不好。
【解决方案3】:

DataContext 类中有一个LoadOptions 属性可以帮助您更急切地获取数据。

否则,您可以使用一些巧妙放置的 ToList()

【讨论】:

    【解决方案4】:

    我知道这个线程很旧......无论如何,有趣的是还没有人提到 .ToLast() 。 我正在做一些事情,其中​​ linq 只不过是一个美化的 foreach 驱动一些副作用,而我并不真正关心查询结果......所以我不想分配任何不必要的虚假内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多