2つのタスクによって実行される以下のコードがあります.2つのトランザクションが実行中で、信頼できるキューから項目をデキューしようとする動作を再現しています。サービスファブリック内のIReliableQueueの並列デキュー
using (var tx = stateManager.CreateTransaction())
{
LogInfo("{0} Dequeueing at {1}", taskName, DateTime.Now.ToString("hh.mm.ss.ffffff")));
ConditionalValue<int> result1 = await items.TryDequeueAsync(tx);
LogInfo("{0} Dequeued at {1}", taskName, DateTime.Now.ToString("hh.mm.ss.ffffff")));
if (task == "Task1")
{
await Task.Delay(4000);
}
else if (task == "Task2")
{
// Do nothing
}
await tx.CommitAsync();
}
私はTask1を最初に発射してから1秒後にFire2を発射します。 Task1は4秒間キューから取り出して待機します。待機中、Task2はトランザクションを開始し、デキューを試みます。ただし、Task1トランザクションが完了するまでブロックされます。
しかし、ドキュメントは以下のように述べている:私の場合は
Transaction is the unit of concurrency: Users can have multiple transactions
in-flight at any given point of time but for a given transaction each API
must be called one at a time. So all Reliable Collection APIs that take in a
transaction and return a Task, must be awaited one at a time
、私は別の回で両方のタスクのためにデキュー呼び出していますが、まだそれがブロックされます。私の理解は正しいのですか?あるいは、私はコードで何か間違っていますか?