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