Azure service fabric 服务结构中IReliableQueue的并行出列

Azure service fabric 服务结构中IReliableQueue的并行出列,azure-service-fabric,Azure Service Fabric,下面是由两个任务执行的代码,我正在复制两个事务正在运行的行为,并尝试将一个项目从可靠队列中退出 using (var tx = stateManager.CreateTransaction()) { LogInfo("{0} Dequeueing at {1}", taskName, DateTime.Now.ToString("hh.mm.ss.ffffff"))); ConditionalValue<int> result1 = await items.TryDe

下面是由两个任务执行的代码,我正在复制两个事务正在运行的行为,并尝试将一个项目从可靠队列中退出

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();
}

在我的例子中,我在不同的时间为两个任务调用dequeue,但它仍然被阻塞。我的理解正确吗?或者我在代码中做错了什么?

IReliableQueue有一些不同的行为,因为它严格遵循先进先出(FIFO)。例如,如果中止Task1的事务,则该项将保留在队列的顶部。如果他们允许Task2成功,那么队列顺序将不会被保留,您将成功地从队列中删除第二项而不是第一项。由于这种FIFO行为,IReliableQueue存在许多锁定问题

如果你不在乎秩序,那就用吧。有关这两种队列类型之间的更多详细信息,请参见本文

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