0

1 回限りのデータ暗号化を実行しようとしている Azure テーブルに妥当な数のレコードがあります。を使うことでスピードアップできると思いましたParallel.ForEach。また、1,000 件を超えるレコードがあり、継続トークンをいじりたくないので、列挙子を取得するために CloudTableQuery を使用しています。

私の問題は、レコードの一部が二重に暗号化されていることであり、返された列挙子がどの程度スレッドセーフであるかがわからないことに気付きましたCloudTableQuery.Execute()。この組み合わせで経験した人は他にいますか?

4

2 に答える 2

1

私の最善の努力にもかかわらず、私は元の問題を再現することができませんでした。したがって、私の結論は、 。Parallel.ForEachでループを使用することは完全にOKであるということですCloudTableQuery.Execute()

于 2011-01-13T03:51:13.757 に答える
1

IEnumeratorスレッドセーフな実装を返す Execute に対する答えはほとんどありません。そうは言っても、これは生産者と消費者のパターンのもう 1 つのケースのように思えます。

あなたの特定のシナリオでは、 Execute を呼び出した元のスレッドに結果を順番に読み取らせ、BlockingCollection<T>. Taskただし、それを開始する前に、を使用してこれらのアイテムの消費を制御するセパレートを開始する必要がありますParallel::ForEachGetConsumingPartitionerこの場合、デフォルトのパーティショナーは必要以上のオーバーヘッドを作成するため、最も効率的にするために、おそらく ParallelExtensions ライブラリのメソッドの使用も検討する必要があります。詳細については、このブログ投稿を参照してください。

BlockingCollection<T>rawを使用することの追加のボーナスは、コンシューマーが追いつくことができないほど多くのアイテムをプロデューサーがコレクションに追加するのをブロックするのに役立つ境界ConcurrentQueueu<T>を設定する機能を提供することです。もちろん、アプリケーションのスイート スポットを見つけるために、いくつかのパフォーマンス テストを行う必要があります。

于 2010-11-30T02:30:23.260 に答える