【问题标题】:Parallelism with Data from SqlDataReader与来自 SqlDataReader 的数据并行
【发布时间】:2013-07-11 04:22:45
【问题描述】:

我有一个循环,从 SqlDataReader 逐行处理数据。它工作得很好。现在我想为它添加并行性。理想情况下,我想读取一行,将其扔到一个线程,读取另一行等。我想要一个可配置的线程数(比如 10 个),这样当一个线程打开(完成其任务)时,另一个线程可以启动。

有没有内置的方法可以做到这一点,还是我应该自己处理?我查看了 PLINQ 和 Parallel,但我想我很难理解它。

【问题讨论】:

标签: c# .net ado.net parallel-processing


【解决方案1】:

由于您使用的是DataReader,它只能向前,并且在内存中一次一行,因此您需要自己处理这个问题。您需要将内存中的行编组为某种数据结构并将其传递给线程,然后再次发出 Read() 以继续下一步。

当您已经打开了太多线程时,您必须确定如何暂停,但这是另一个完全不同的讨论,如果您最终对此有疑问,那么发布什么您有,我们很乐意提供帮助!

【讨论】:

  • 谢谢迈克尔。在您看来,还有比 DataReader 更好的选择吗?行数太多,无法一次将其全部读入内存。
  • 另外,您知道在哪里可以找到实现此功能的示例吗? (大部分是谷歌搜索的正确术语)
  • @Jonesy,我认为没有更好的方法。我认为你做对了。此外,可能没有什么好东西可以搜索,因为这是一个非常自定义的实现——我只想写它。简而言之,将内存中的行放入一个新对象中,然后将该对象排队以供后台线程使用。我建议使用BackgroundWorkerConcurrentQueue,除非您真的遇到问题,否则我不会担心暂停ConcurrentQueue 是线程安全的,因此您可以安全地从不同的线程读取/写入。
  • 我添加到原始问题的链接有一个关于如何做的代码示例。
猜你喜欢
  • 2015-10-05
  • 2014-03-03
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多