可以将Parallel.ForEach安全地与CloudTableQuery一起使用

时间:2010-09-08 01:48:24

标签: parallel-extensions azure-table-storage

我在Azure表中有一个合理数量的记录,我正在尝试进行一次数据加密。我认为我可以使用Parallel.ForEach加快速度。另外因为有超过1K的记录,我不想乱用继续令牌,我正在使用CloudTableQuery来获取我的枚举器。

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

2 个答案:

答案 0 :(得分:1)

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

在您的特定场景中,我将使用名为Execute的原始线程按顺序读取结果并将其填入BlockingCollection<T>。在开始这样做之前,您需要启动一个单独的Task,它将使用Parallel::ForEach控制这些项目的消耗。现在,您可能还需要研究使用ParallelExtensions库的GetConsumingPartitioner方法,以便最有效,因为默认分区程序会产生比此情况下更多的开销。您可以从this blog post了解更多相关信息。

使用BlockingCollection<T>优于原始ConcurrentQueueu<T>的另一个好处是,它提供了set bounds的功能,可以帮助阻止生产者向集合中添加比消费者更多的项目跟上。您当然需要进行一些性能测试,以找到适合您应用的最佳位置。

答案 1 :(得分:1)

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

相关问题