Paginering met de Azure SDK voor .NET
In dit artikel leert u hoe u de Azure SDK voor .NET-pagineringsfunctionaliteit gebruikt om efficiënt en productief te werken met grote gegevenssets. Paginering is het verdelen van grote gegevenssets in pagina's, waardoor de consument gemakkelijker kleinere hoeveelheden gegevens kan doorlopen. Vanaf C# 8 kunt u streams asynchroon maken en gebruiken met behulp van Asynchrone (asynchrone) streams. Asynchrone streams zijn gebaseerd op de IAsyncEnumerable<T> interface. Met de Azure SDK voor .NET wordt een implementatie van IAsyncEnumerable<T>
deze AsyncPageable<T>
klasse weergegeven.
Alle voorbeelden in dit artikel zijn afhankelijk van de volgende NuGet-pakketten:
- Azure.Security.KeyVault.Secrets
- Microsoft.Extensions.Azure
- Microsoft.Extensions.Hosting
- System.Linq.Async
Voor de nieuwste map van Azure SDK voor .NET-pakketten raadpleegt u de nieuwste versies van Azure SDK.
Paginabare retourtypen
Clients die zijn geïnstantieerd vanuit de Azure SDK voor .NET, kunnen de volgende paginabare typen retourneren.
Type | Description |
---|---|
Pageable<T> |
Een verzameling waarden die zijn opgehaald in pagina's |
AsyncPageable<T> |
Een verzameling waarden die asynchroon worden opgehaald op pagina's |
De meeste voorbeelden in dit artikel zijn asynchroon, met behulp van variaties van het AsyncPageable<T>
type. Het gebruik van asynchrone programmering voor I/O-gebonden bewerkingen is ideaal. Een perfecte use-case is het gebruik van de asynchrone API's van de Azure SDK voor .NET, omdat deze bewerkingen HTTP/S-netwerkoproepen vertegenwoordigen.
AsyncPageable
Herhalen metawait foreach
Als u de AsyncPageable<T>
await foreach
syntaxis wilt herhalen, bekijkt u het volgende voorbeeld:
async Task IterateSecretsWithAwaitForeachAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
}
}
In de voorgaande C#-code:
- De SecretClient.GetPropertiesOfSecretsAsync methode wordt aangeroepen en retourneert een
AsyncPageable<SecretProperties>
object. - In een
await foreach
lus wordt elkSecretProperties
asynchroon geretourneerd. - Zoals elk
secret
is gerealiseerd,Name
wordt het naar de console geschreven.
AsyncPageable
Herhalen metwhile
Als u de syntaxis wilt herhalen AsyncPageable<T>
wanneer de await foreach
syntaxis niet beschikbaar is, gebruikt u een while
lus.
async Task IterateSecretsWithWhileLoopAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
IAsyncEnumerator<SecretProperties> enumerator = allSecrets.GetAsyncEnumerator();
try
{
while (await enumerator.MoveNextAsync())
{
SecretProperties secret = enumerator.Current;
Console.WriteLine($"IterateSecretsWithWhileLoopAsync: {secret.Name}");
}
}
finally
{
await enumerator.DisposeAsync();
}
}
In de voorgaande C#-code:
- De SecretClient.GetPropertiesOfSecretsAsync methode wordt aangeroepen en retourneert een
AsyncPageable<SecretProperties>
object. - De AsyncPageable<T>.GetAsyncEnumerator methode wordt aangeroepen en retourneert een
IAsyncEnumerator<SecretProperties>
. - De MoveNextAsync() methode wordt herhaaldelijk aangeroepen totdat er geen items zijn die moeten worden geretourneerd.
Pagina's herhalen AsyncPageable
Als u controle wilt over het ontvangen van pagina's met waarden van de service, gebruikt u de AsyncPageable<T>.AsPages
methode:
async Task IterateSecretsAsPagesAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (Page<SecretProperties> page in allSecrets.AsPages())
{
foreach (SecretProperties secret in page.Values)
{
Console.WriteLine($"IterateSecretsAsPagesAsync: {secret.Name}");
}
// The continuation token that can be used in AsPages call to resume enumeration
Console.WriteLine(page.ContinuationToken);
}
}
In de voorgaande C#-code:
- De SecretClient.GetPropertiesOfSecretsAsync methode wordt aangeroepen en retourneert een
AsyncPageable<SecretProperties>
object. - De AsyncPageable<T>.AsPages methode wordt aangeroepen en retourneert een
IAsyncEnumerable<Page<SecretProperties>>
. - Elke pagina wordt asynchroon ge curseerd, met behulp van
await foreach
. - Elke pagina heeft een set Page<T>.Values, die een
IReadOnlyList<T>
is die wordt ge curseerd met een synchroneforeach
. - Elke pagina bevat ook een Page<T>.ContinuationToken, die kan worden gebruikt om de volgende pagina aan te vragen.
Gebruiken System.Linq.Async
met AsyncPageable
Het System.Linq.Async
pakket biedt een set LINQ-methoden die op IAsyncEnumerable<T> type werken. Omdat AsyncPageable<T>
dit wordt geïmplementeerd IAsyncEnumerable<T>
, kunt u de System.Linq.Async
gegevens opvragen en transformeren.
Converteren naar een List<T>
Hiermee ToListAsync
converteert u een AsyncPageable<T>
naar een List<T>
. Met deze methode kunnen verschillende serviceaanroepen worden aangeroepen als de gegevens niet op één pagina worden geretourneerd.
async Task ToListAsync()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
List<SecretProperties> secretList = await allSecrets.ToListAsync();
secretList.ForEach(secret =>
Console.WriteLine($"ToListAsync: {secret.Name}"));
}
In de voorgaande C#-code:
- De SecretClient.GetPropertiesOfSecretsAsync methode wordt aangeroepen en retourneert een
AsyncPageable<SecretProperties>
object. - De
ToListAsync
methode wordt in afwachting van een nieuweList<SecretProperties>
instantie.
Neem de eerste N-elementen
Take
kan worden gebruikt om alleen de eerste N
elementen van de AsyncPageable
. Met het gebruik Take
worden de minste service-aanroepen uitgevoerd die nodig zijn om items op te halen N
.
async Task TakeAsync(int count = 30)
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets.Take(count))
{
Console.WriteLine($"TakeAsync: {secret.Name}");
}
}
Meer methoden
System.Linq.Async
biedt andere methoden die functionaliteit bieden die equivalent is aan hun synchrone Enumerable
tegenhangers. Voorbeelden van dergelijke methoden zijn Select
, Where
, en OrderBy
GroupBy
.
Pas op voor evaluatie aan de clientzijde
Wanneer u het System.Linq.Async
pakket gebruikt, moet u ervoor zorgen dat LINQ-bewerkingen op de client worden uitgevoerd. Met de volgende query worden alle items opgehaald om ze te tellen:
// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
await client.GetPropertiesOfSecretsAsync()
.CountAsync();
Waarschuwing
Dezelfde waarschuwing geldt voor operators zoals Where
. Geef altijd de voorkeur aan filteren, aggregatie of projecties van gegevens op de server, indien beschikbaar.
Als een waarneembare reeks
Het System.Linq.Async
pakket wordt voornamelijk gebruikt om waarnemerspatroonmogelijkheden te bieden via IAsyncEnumerable<T>
reeksen. Asynchrone streams zijn pull-gebaseerd. Wanneer hun items worden ge curseerd, wordt het volgende beschikbare item opgehaald. Deze benadering bevindt zich in juxtapositie met het waarnemerspatroon, dat op push gebaseerde is. Wanneer er items beschikbaar komen, worden ze gepusht naar abonnees die als waarnemers fungeren. Het System.Linq.Async
pakket biedt de ToObservable
extensiemethode waarmee u een IAsyncEnumerable<T>
bestand kunt converteren naar een IObservable<T>
.
Stel u een implementatie voor IObserver<SecretProperties>
:
sealed file class SecretPropertyObserver : IObserver<SecretProperties>
{
public void OnCompleted() =>
Console.WriteLine("Done observing secrets");
public void OnError(Exception error) =>
Console.WriteLine($"Error observing secrets: {error}");
public void OnNext(SecretProperties secret) =>
Console.WriteLine($"Observable: {secret.Name}");
}
U kunt de ToObservable
extensiemethode als volgt gebruiken:
IDisposable UseTheToObservableMethod()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
IObservable<SecretProperties> observable = allSecrets.ToObservable();
return observable.Subscribe(
new SecretPropertyObserver());
}
In de voorgaande C#-code:
- De SecretClient.GetPropertiesOfSecretsAsync methode wordt aangeroepen en retourneert een
AsyncPageable<SecretProperties>
object. - De
ToObservable()
methode wordt aangeroepen op hetAsyncPageable<SecretProperties>
exemplaar en retourneert eenIObservable<SecretProperties>
. - Het
observable
abonnement wordt geabonneerd, doorgegeven in de implementatie van de waarnemer, die het abonnement retourneert naar de beller. - Het abonnement is een
IDisposable
. Wanneer het abonnement wordt verwijderd, wordt het abonnement beëindigd.
Paginabaar herhalen
Pageable<T>
is een synchrone versie van AsyncPageable<T>
die kan worden gebruikt met een normale foreach
lus.
void IterateWithPageable()
{
Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();
foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateWithPageable: {secret.Name}");
}
}
Belangrijk
Hoewel deze synchrone API beschikbaar is, gebruikt u de asynchrone API-alternatieven voor een betere ervaring.