IReliableConcurrentQueue<T>.TryDequeueAsync Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Remover provisoriamente um valor da fila. Se a fila estiver vazia, a operação de remoção de fila aguardará que um item fique disponível.
public System.Threading.Tasks.Task<Microsoft.ServiceFabric.Data.ConditionalValue<T>> TryDequeueAsync (Microsoft.ServiceFabric.Data.ITransaction tx, System.Threading.CancellationToken cancellationToken = default, TimeSpan? timeout = default);
abstract member TryDequeueAsync : Microsoft.ServiceFabric.Data.ITransaction * System.Threading.CancellationToken * Nullable<TimeSpan> -> System.Threading.Tasks.Task<Microsoft.ServiceFabric.Data.ConditionalValue<'T>>
Public Function TryDequeueAsync (tx As ITransaction, Optional cancellationToken As CancellationToken = Nothing, Optional timeout As Nullable(Of TimeSpan) = Nothing) As Task(Of ConditionalValue(Of T))
Parâmetros
- tx
- ITransaction
Transação à qual associar essa operação.
- cancellationToken
- CancellationToken
O token a se monitorar para solicitações de cancelamento. O padrão é None.
A quantidade de tempo a aguardar a conclusão da operação. O padrão é nulo. Se nulo for passado, um tempo limite padrão será usado.
Retornos
Uma tarefa que representa a operação assíncrona de remoção de fila. O resultado da tarefa é um ConditionalValue do tipo T. Se um valor tiver sido descontinuado dentro do tempo determinado, retorne um ConditionalValue com HasValue como false, caso contrário, ele retornará um ConditionalValue com HasValue como true e o Value como o item dequeued do Tipo T
Exceções
O réplica não está mais em .
No momento, o réplica não é legível.
O IReliableConcurrentQueue<T> foi fechado pelo runtime.
O réplica viu uma falha transitória. Repetir a operação em uma nova transação
O réplica viu uma falha não retriável diferente dos tipos definidos acima. Limpar e relançar a exceção
A operação não pôde ser concluída dentro do tempo limite determinado. A transação deve ser anulada e uma nova transação deve ser criada para tentar novamente.
tx
é nulo. Não manipule essa exceção.
A operação foi cancelada por meio de cancellationToken
.
A transação foi falha interna pelo sistema. Repetir a operação em uma nova transação
Gerada quando uma chamada de método é inválida para o estado atual do objeto. Por exemplo, a transação usada já foi encerrada: confirmada ou anulada pelo usuário. Se essa exceção for gerada, é altamente provável que haja um bug no código de serviço do uso de transações.
Exemplos
Este exemplo mostra como remover a fila e registrar em log infinitamente com repetição, até que o token de cancelamento seja cancelado.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var concurrentQueue = await this.StateManager.GetOrAddAsync<IReliableConcurrentQueue<long>>(new Uri("fabric:/concurrentQueue"));
// Assumption: values are being enqueued by another source (e.g. the communication listener).
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
try
{
using (var tx = this.StateManager.CreateTransaction())
{
var dequeueOutput = await concurrentQueue.TryDequeueAsync(tx, cancellationToken, TimeSpan.FromMilliseconds(100));
await tx.CommitAsync();
if (dequeueOutput.HasValue)
{
Console.WriteLine("Dequeue # " + dequeueOutput);
}
else
{
Console.WriteLine("Could not dequeue in the given time");
}
}
}
catch (TransactionFaultedException e)
{
// This indicates that the transaction was internally faulted by the system. One possible cause for this is that the transaction was long running
// and blocked a checkpoint. Increasing the "ReliableStateManagerReplicatorSettings.CheckpointThresholdInMB" will help reduce the chances of running into this exception
Console.WriteLine("Transaction was internally faulted, retrying the transaction: " + e);
}
catch (FabricNotPrimaryException e)
{
// Gracefully exit RunAsync as the new primary should have RunAsync invoked on it and continue work.
// If instead dequeue was being executed as part of a client request, the client would be signaled to re-resolve.
Console.WriteLine("Replica is not primary, exiting RunAsync: " + e);
return;
}
catch (FabricNotReadableException e)
{
// Retry until the queue is readable or a different exception is thrown.
Console.WriteLine("Queue is not readable, retrying the transaction: " + e);
}
catch (FabricObjectClosedException e)
{
// Gracefully exit RunAsync as this is happening due to replica close.
// If instead dequeue was being executed as part of a client request, the client would be signaled to re-resolve.
Console.WriteLine("Replica is closing, exiting RunAsync: " + e);
return;
}
catch (TimeoutException e)
{
Console.WriteLine("Encountered TimeoutException during DequeueAsync, retrying the transaction: " + e);
}
catch (FabricTransientException e)
{
// Retry until the queue is writable or a different exception is thrown.
Console.WriteLine("Queue is currently not writable, retrying the transaction: " + e);
}
// Delay and retry.
await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken);
}
}
Comentários
Embora TryDequeueAsync(ITransaction, CancellationToken, Nullable<TimeSpan>) só possa retornar valores para os quais o correspondente EnqueueAsync(ITransaction, T, CancellationToken, Nullable<TimeSpan>) foi confirmado, TryDequeueAsync(ITransaction, CancellationToken, Nullable<TimeSpan>) as operações não são isoladas umas das outras. Depois que uma transação tiver descontinuado um valor, outras transações não poderão desempedi-la, mas não serão impedidas de remover a fila de outros valores.
Quando uma transação ou transações que incluem uma ou mais TryDequeueAsync(ITransaction, CancellationToken, Nullable<TimeSpan>) operações for anulada, os valores dequeu serão adicionados novamente ao cabeçalho da fila em uma ordem arbitrária. Isso garantirá que esses valores serão desempedidos novamente em breve, melhorando a imparcialidade da estrutura de dados, mas sem impor uma ordenação estrita (o que exigiria reduzir a simultaneidade permitida, como em IReliableQueue<T>).
Aplica-se a
Azure SDK for .NET