强迫Linq不要延迟执行

时间:2009-06-30 14:38:26

标签: c# linq delayed-execution

事实上,这是与这篇文章相同的问题:

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.感觉就像拳击即将在另一个线程中暂时取消装箱的东西。

4 个答案:

答案 0 :(得分:23)

你不会拳击任何东西 - 你要缓冲结果。

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

另一种方法是进行处理,然后在那里进行处理 - 急切地使用数据。我并没有完全遵循不同的线程方面,因此我不清楚这是否会对你有所帮助,但就我所见,这些基本上是你可以选择的。

在您的描述中,这实际上是有点显式:

  

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:0)

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

否则你可以使用一些聪明的ToList()

答案 3 :(得分:-6)

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