Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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. De Azure SDK voor .NET biedt een implementatie van IAsyncEnumerable<T>
met zijn AsyncPageable<T>
klasse.
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.
Pagina-gebaseerde retourtypen
Clients die zijn geïnstantieerd vanuit de Azure SDK voor .NET, kunnen de volgende paginabare typen retourneren.
Typologie | Beschrijving |
---|---|
Pageable<T> |
Een verzameling waarden die uit pagina's zijn opgehaald. |
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.
Itereer over AsyncPageable
met await foreach
Om over een AsyncPageable<T>
te itereren met behulp van de await foreach
syntaxis, bekijk 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 opgeleverd. - Wanneer elke
secret
wordt gerealiseerd, wordt deName
naar de console geschreven.
Itereer over AsyncPageable
met while
Om over een AsyncPageable<T>
te itereren 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.
Itereren over AsyncPageable
pagina's
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ïtereerd, met behulp van
await foreach
. - Elke pagina heeft een set Page<T>.Values, die een
IReadOnlyList<T>
vertegenwoordigt en die wordt geïtereerd met een synchroneforeach
. - Elke pagina bevat ook een Page<T>.ContinuationToken, die kan worden gebruikt om de volgende pagina aan te vragen.
System.Linq.Async
gebruiken met AsyncPageable
Het System.Linq.Async
pakket biedt een set LINQ-methoden die op IAsyncEnumerable<T> type werken. Omdat AsyncPageable<T>
IAsyncEnumerable<T>
implementeert, kunt u System.Linq.Async
gebruiken om de gegevens op te vragen en te transformeren.
Converteren naar een List<T>
Hiermee ToListAsync
converteert u een AsyncPageable<T>
naar een List<T>
. Met deze methode kunnen verschillende serviceaanroepen worden uitgevoerd als de gegevens niet op één pagina terugkomen.
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 afgewacht, wat resulteert in een nieuweList<SecretProperties>
instantie.
Neem de eerste N-elementen
Take
kan worden gebruikt om alleen de eerste N
elementen van de AsyncPageable
te krijgen. 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ïtereerd, wordt het volgende beschikbare item opgehaald. Deze benadering bevindt zich in tegenstelling tot het observer pattern, dat op push gebaseerd is. Wanneer er items beschikbaar komen, worden ze gestuurd 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 je een IObserver<SecretProperties>
implementatie voor
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 wordt verwijderd, eindigt het abonnement.
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.