CloudTableQueryで安全に使用できます
-
01-10-2019 - |
質問
Azureテーブルには、一度のデータ暗号化を行うことを試みている妥当な数のレコードがあります。私は使用して物事をスピードアップできると思った Parallel.ForEach
. 。また、1Kを超えるレコードがあり、私は継続トークンを混乱させたくないので、私は列挙されたクエリを使用して列挙者を取得しています。
私の問題は、私のレコードのいくつかが二重に暗号化されており、列挙者がどのように戻ってくるかがどのように安全かわからないことに気付きました。 CloudTableQuery.Execute()
は。他の誰かがこの組み合わせの経験をしましたか?
解決 2
私の最善の努力にもかかわらず、私は元の問題を再現することができませんでした。したがって、私の結論は、使用しても大丈夫だということです Parallel.ForEach
でループ CloudTableQuery.Execute()
.
他のヒント
私はスレッドセーフを返すことを実行するための答えを喜んで賭けます IEnumerator
実装はほとんどありません。とはいえ、これはさらに別のケースのように聞こえます プロデューサー消費者パターン.
あなたの特定のシナリオでは、executeと呼ばれる元のスレッドが順番に結果を読み取り、それらをに詰めます BlockingCollection<T>
. 。あなたがそれを始める前に、あなたは別のものを始めたいです Task
これにより、使用しているアイテムの消費が制御されます Parallel::ForEach
. 。今、あなたはおそらく、 GetConsumingPartitioner
デフォルトのパーティショナーは、この場合に望むよりも多くのオーバーヘッドを作成するため、ParallemExtensionsライブラリの方法が最も効率的であるためです。これについては詳細をご覧ください このブログ投稿.
使用の追加ボーナス BlockingCollection<T>
生で ConcurrentQueueu<T>
それが能力を提供するということです 境界を設定します これは、消費者が追いつくことができるよりも、プロデューサーがコレクションにアイテムを追加するのをブロックするのに役立ちます。もちろん、アプリケーションのスイートスポットを見つけるために、パフォーマンステストを行う必要があります。