IReliableConcurrentQueue<T>.EnqueueAsync Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Placez la file d’attente d’une valeur dans la file d’attente.
public System.Threading.Tasks.Task EnqueueAsync (Microsoft.ServiceFabric.Data.ITransaction tx, T value, System.Threading.CancellationToken cancellationToken = default, TimeSpan? timeout = default);
abstract member EnqueueAsync : Microsoft.ServiceFabric.Data.ITransaction * 'T * System.Threading.CancellationToken * Nullable<TimeSpan> -> System.Threading.Tasks.Task
Public Function EnqueueAsync (tx As ITransaction, value As T, Optional cancellationToken As CancellationToken = Nothing, Optional timeout As Nullable(Of TimeSpan) = Nothing) As Task
Paramètres
- tx
- ITransaction
Transaction à laquelle associer cette opération.
- value
- T
Valeur à ajouter à la fin de la file d’attente. La valeur peut être null pour les types référence.
- cancellationToken
- CancellationToken
Jeton pour surveiller les requêtes d'annulation. Par défaut, il s’agit de None.
Délai d’attente de la fin de l’opération avant de lever une exception TimeoutException. La valeur par défaut est null. Si null est passé, un délai d’expiration par défaut est utilisé.
Retours
Tâche qui représente l’opération de mise en file d’attente asynchrone.
Exceptions
Le réplica n’est plus dans .
Le réplica n’est actuellement pas lisible.
a IReliableConcurrentQueue<T> été fermé par le runtime.
Le réplica a vu une défaillance temporaire. Réessayez l’opération sur une nouvelle transaction
Le réplica a vu une défaillance non retenable autre que les types définis ci-dessus. Nettoyer et relancer l’exception
L’opération n’a pas pu être effectuée dans le délai d’expiration donné. La transaction doit être abandonnée et une nouvelle transaction doit être créée pour réessayer.
tx
a la valeur null.
L’opération a été annulée via cancellationToken
.
La transaction a été défaillante en interne par le système. Réessayez l’opération sur une nouvelle transaction
Levée lorsqu’un appel de méthode n’est pas valide pour l’état actuel de l’objet. Par exemple, la transaction utilisée est déjà terminée : validée ou abandonnée par l’utilisateur. Si cette exception est levée, il est très probable qu’il y ait un bogue dans le code de service de l’utilisation des transactions.
Exemples
Cet exemple montre comment utiliser EnqueueAsync(ITransaction, T, CancellationToken, Nullable<TimeSpan>) pour mettre en file d’attente une valeur avec une nouvelle tentative.
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var concurrentQueue = await this.StateManager.GetOrAddAsync<IReliableConcurrentQueue<long>>(new Uri("fabric:/concurrentQueue"));
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
try
{
using (var tx = this.StateManager.CreateTransaction())
{
await concurrentQueue.EnqueueAsync(tx, 12L, cancellationToken);
await tx.CommitAsync();
return;
}
}
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 enqueue 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 enqueue 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 EnqueueAsync, 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);
}
}
Remarques
Une TryDequeueAsync(ITransaction, CancellationToken, Nullable<TimeSpan>) opération ne peut pas retourner une valeur pour laquelle son EnqueueAsync(ITransaction, T, CancellationToken, Nullable<TimeSpan>) n’a pas encore été validée. Cela inclut la transaction dans laquelle la valeur a été mise en file d’attente ; par conséquent, IReliableConcurrentQueue<T> ne prend pas en charge la lecture de vos écritures.
S’applique à
Azure SDK for .NET