【问题标题】:will linq to objects block the thread?linq to objects 会阻塞线程吗?
【发布时间】:2011-10-21 20:28:39
【问题描述】:

我对对象使用 linq,发现 .ToList 和 .ToArray 操作阻塞了线程。 (在性能报告中,我看到了阻塞时间。)我猜这是因为当我调用 tolist 或 toarray 时 GC 正在尝试分配内存。这很糟糕,因为我在并行循环中使用 linq,并且我希望访问 linq 中的一些共享集合。 除了不使用 linq 来反对之外,有没有办法解决这个问题?

【问题讨论】:

  • 你有一个具体的例子来说明你在做什么吗?特别是对于线程,了解细节很重要。
  • I'm using linq in a parallel loop: 你的意思是你在用PLinq?
  • @phoog:不,linq 在 parallel.for 循环中

标签: .net linq concurrency linq-to-objects


【解决方案1】:

调用 ToListToArray 会导致查询立即得到评估 - 这将阻塞调用它们的线程,直到整个集合被评估并返回查询结果。

您应该直接遍历查询而不调用任何一种方法 - 这会将结果流式传输(假设没有其他急切的评估发生)。

如果你需要做并发工作,我建议你看看Task Parallel Library (TPL)。

【讨论】:

  • 谢谢。我按照您的建议运行迭代。现在争用时间转到: -System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() --ConsoleApplication3.Module1._Lambda$__7(class VB$AnonymousType_02,class ConsoleApplication3.Module1/ClassC) ---JIT_NewFast(struct CORINFO_CLASS_STRUCT_ *)。有什么想法吗?
  • 终于得到了答案。我唯一需要做的就是将 GC 转换为服务器模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2018-03-03
相关资源
最近更新 更多