2017-10-14 4 views
0

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 

、私は別の回で両方のタスクのためにデキュー呼び出していますが、まだそれがブロックされます。私の理解は正しいのですか?あるいは、私はコードで何か間違っていますか?

答えて

1

IReliableQueueは厳密に先入れ先出し(FIFO)であるため、いくつかの動作が異なります。たとえば、Task1のトランザクションを中止すると、アイテムはキューの一番上に残ります。タスク2が成功すると、キューの順序は保持されず、最初のアイテムではなくキューから2番目のアイテムが正常に削除されます。このFIFO動作のために、IReliableQueueにはいくつかのロック問題があります。

ご注文を気にしない場合は、ReliableConcurrentQueueをご利用ください。 2つのキュータイプの詳細については、articleを参照してください。

関連する問題