代码之家  ›  专栏  ›  技术社区  ›  knightpfhor

可以将parallel.foreach安全地与cloudTableQuery一起使用

  •  0
  • knightpfhor  · 技术社区  · 16 年前

    我在一个Azure表中有合理数量的记录,我正试图对其进行一次性数据加密。我想我可以用 Parallel.ForEach . 另外,因为有超过1K的记录,而且我不想自己乱弄连续标记,所以我使用了一个CloudTableQuery来获取枚举器。

    我的问题是,我的一些记录被双重加密,我意识到我不知道线程如何保护枚举器返回 CloudTableQuery.Execute() 是。其他人对这种组合有经验吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Drew Marsh    15 年前

    我愿意打赌执行返回线程安全的答案 IEnumerator 实施的可能性非常小。也就是说,这听起来像是 producer-consumer pattern .

    在您的特定场景中,我将让调用execute的原始线程按顺序读取结果,并将其放入 BlockingCollection<T> . 在你开始做之前,你想开始一个单独的 Task 这将控制使用 Parallel::ForEach . 现在,您可能还想研究使用 GetConsumingPartitioner ParallelExtensions库的方法,以便最有效,因为在这种情况下,默认分区程序将产生比您想要的更多的开销。你可以从以下网站了解更多信息 this blog post .

    使用的额外奖励 阻止收集<t> 超过原材料 ConcurrentQueueu<T> 它提供了 set bounds 这有助于阻止生产者向收藏中添加超过消费者所能跟上的项目。当然,您需要做一些性能测试来找到应用程序的最佳位置。

        2
  •  1
  •   knightpfhor    15 年前

    尽管我尽了最大努力,我还是无法复制我原来的问题。因此,我的结论是完全可以使用 Parallel.ForEach 循环带 CloudTableQuery.Execute() .

    推荐文章