我在Azure表中有一个合理数量的记录,我正在尝试进行一次数据加密。我认为我可以使用Parallel.ForEach
加快速度。另外因为有超过1K的记录,我不想乱用继续令牌,我正在使用CloudTableQuery来获取我的枚举器。
我的问题是我的一些记录已被双重加密,我意识到我不确定CloudTableQuery.Execute()
返回的枚举器的线程安全性如何。有没有其他人有这种组合的经验?
答案 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()
一起使用是完全可以的。