我正在尝试对其进行一次性数据加密的 Azure 表中有合理数量的记录。我认为我可以通过使用Parallel.ForEach
. 另外,因为有超过 1K 条记录,而且我不想自己弄乱延续令牌,所以我正在使用 CloudTableQuery 来获取我的枚举器。
我的问题是我的一些记录已被双重加密,我意识到我不确定返回的枚举CloudTableQuery.Execute()
器的线程安全性如何。有没有其他人有过这种组合的经验?
我正在尝试对其进行一次性数据加密的 Azure 表中有合理数量的记录。我认为我可以通过使用Parallel.ForEach
. 另外,因为有超过 1K 条记录,而且我不想自己弄乱延续令牌,所以我正在使用 CloudTableQuery 来获取我的枚举器。
我的问题是我的一些记录已被双重加密,我意识到我不确定返回的枚举CloudTableQuery.Execute()
器的线程安全性如何。有没有其他人有过这种组合的经验?
我愿意打赌 Execute 返回线程安全IEnumerator
实现的答案是极不可能的。也就是说,这听起来像是生产者-消费者模式的又一个案例。
在您的特定场景中,我会让调用 Execute 的原始线程按顺序读取结果并将它们填充到BlockingCollection<T>
. 不过,在开始执行此操作之前,您需要启动一个单独Task
的项目来控制使用Parallel::ForEach
. 现在,您可能还想考虑使用GetConsumingPartitioner
ParallelExtensions 库的方法以提高效率,因为在这种情况下,默认分区程序会产生比您想要的更多的开销。您可以从这篇博文中了解更多相关信息。
BlockingCollection<T>
使用原始数据的另一个好处ConcurrentQueueu<T>
是它提供了设置边界的能力,这可以帮助阻止生产者向集合中添加比消费者能够跟上的更多的项目。您当然需要进行一些性能测试来为您的应用程序找到最佳位置。
尽管我尽了最大的努力,我还是无法复制我原来的问题。因此,我的结论是,将Parallel.ForEach
循环与CloudTableQuery.Execute()
.