IReliableConcurrentQueue<T>.EnqueueAsync Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellen Sie die Warteschlange eines Werts in die Warteschlange ein.
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
Parameter
- tx
- ITransaction
Transaktion, der dieser Vorgang zugeordnet werden soll.
- value
- T
Der Wert, der am Ende der Warteschlange hinzugefügt werden soll. Der Wert kann für Verweistypen NULL sein.
- cancellationToken
- CancellationToken
Das Token zum Überwachen von Abbruchanforderungen. Der Standardwert ist None.
Die Zeit, die gewartet werden muss, bis der Vorgang abgeschlossen ist, bevor eine TimeoutException ausgelöst wird. Der Standardwert ist NULL. Wenn NULL übergeben wird, wird ein Standardtimeout verwendet.
Gibt zurück
Aufgabe, die den asynchronen Queue-Vorgang darstellt.
Ausnahmen
Das Replikat befindet sich nicht mehr in .
Das Replikat ist derzeit nicht lesbar.
Die IReliableConcurrentQueue<T> wurde von der Runtime geschlossen.
Beim Replikat ist ein vorübergehender Fehler aufgetreten. Wiederholen des Vorgangs für eine neue Transaktion
Für das Replikat ist ein nicht wiederholbarer Fehler aufgetreten, der nicht die oben definierten Typen ist. Bereinigen und erneutes Ausführen der Ausnahme
Der Vorgang konnte nicht innerhalb des angegebenen Timeouts abgeschlossen werden. Die Transaktion sollte abgebrochen und eine neue Transaktion erstellt werden, um es erneut zu versuchen.
tx
ist NULL.
Der Vorgang wurde über cancellationToken
abgebrochen.
Die Transaktion wurde intern vom System fehlerhaft gemacht. Wiederholen des Vorgangs für eine neue Transaktion
Wird ausgelöst, wenn ein Methodenaufruf für den aktuellen Zustand des Objekts ungültig ist. Beispiel: Die verwendete Transaktion ist bereits beendet: vom Benutzer zugesagt oder abgebrochen. Wenn diese Ausnahme ausgelöst wird, ist es sehr wahrscheinlich, dass im Dienstcode der Verwendung von Transaktionen ein Fehler vorliegt.
Beispiele
In diesem Beispiel wird gezeigt, wie sie verwenden EnqueueAsync(ITransaction, T, CancellationToken, Nullable<TimeSpan>) , um einen Wert mit Wiederholung in Quequeque zu stellen.
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);
}
}
Hinweise
Ein TryDequeueAsync(ITransaction, CancellationToken, Nullable<TimeSpan>) Vorgang kann keinen Wert zurückgeben, für den er EnqueueAsync(ITransaction, T, CancellationToken, Nullable<TimeSpan>) noch nicht committet wurde. Dies schließt die Transaktion ein, in der der Wert in die Warteschlange gestellt wurde; IReliableConcurrentQueue<T> daher wird Read-Your-Writes nicht unterstützt.
Gilt für:
Azure SDK for .NET