2010-09-08 57 views
0

我在Azure表中有合理数量的记录,我试图对其执行一次数据加密。我认为我可以通过使用Parallel.ForEach加快速度。另外,因为有超过1K条记录,我不想乱动延续令牌,我正在使用CloudTableQuery来获取我的枚举器。可以将Parallel.ForEach安全地用于CloudTableQuery

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

回答

1

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

1

我愿意打赌回答执行返回一个线程安全IEnumerator实现是不太可能的。这就是说,这听起来像是producer-consumer pattern的另一种情况。

在您的特定情况下,我会让原始线程调用Execute按顺序读取结果,并将它们填入BlockingCollection<T>。然而,在你开始做这件事之前,你需要开始一个单独的Task,它将使用Parallel::ForEach来控制这些项目的消耗。现在,您可能还需要考虑使用ParallelExtensions库的GetConsumingPartitioner方法,以便提高效率,因为在这种情况下,默认分区程序会创建比您想要的更多的开销。你可以从this blog post了解更多。

另外一个使用BlockingCollection<T>在原ConcurrentQueueu<T>的好处是,它提供的能力,set bounds它可以帮助增加更多的项目比消费者可以跟上集阻止生产商。您当然需要做一些性能测试,以找到适合您的应用的最佳位置。

+0

由于我问了这个问题,我有机会尝试重新创建我遇到的情景,到目前为止我一直无法复制这个问题(因为它一直是不可重复的,我一直无法给它多注意)。你的建议肯定会确保它不是问题。我想再做一些调查,看看是否需要额外的努力。 – knightpfhor 2010-12-01 22:57:48

+0

好吧,说实话,我意识到我在你的特殊情况下错过了。 Parallel :: ForEach将确保只从批处理中的初始线程中读取枚举器,然后将读取的单个项目排除到计划在潜在独立线程上运行的任务。所以你根本不需要实际上需要在这里实现生产者 - 消费者模式,因为你已经有了一个生成项目到流中的源(即从执行返回的CloudTableQuery的IEnumerable)。 – 2010-12-02 01:02:40

相关问题