Stronicowanie przy użyciu zestawu Azure SDK dla platformy .NET
W tym artykule dowiesz się, jak wydajnie i wydajnie pracować z dużymi zestawami danych za pomocą zestawu Azure SDK dla platformy .NET na potrzeby stronicowania. Stronicowanie to proces dzielenia dużych zestawów danych na strony, co ułatwia konsumentowi iterowanie po mniejszych ilościach danych. Począwszy od języka C# 8, można tworzyć strumienie asynchronicznie i korzystać z nich przy użyciu strumieni asynchronicznych (asynchronicznych). Strumienie asynchroniczne są oparte na interfejsie IAsyncEnumerable<T> . Zestaw Azure SDK dla platformy .NET uwidacznia implementację klasy IAsyncEnumerable<T>
AsyncPageable<T>
.
Wszystkie przykłady w tym artykule bazują na następujących pakietach NuGet:
- Azure.Security.KeyVault.Secrets
- Microsoft.Extensions.Azure
- Microsoft.Extensions.Hosting
- System.Linq.Async
Najnowsze wersje zestawu Azure SDK dla platformy .NET można znaleźć w artykule Azure SDK latest releases (Najnowsze wersje zestawu Azure SDK).
Stronicowalne typy zwracane
Klienci utworzone z zestawu Azure SDK dla platformy .NET mogą zwracać następujące typy stronicowalne.
Type | Opis |
---|---|
Pageable<T> |
Kolekcja wartości pobranych na stronach |
AsyncPageable<T> |
Kolekcja wartości asynchronicznie pobierana na stronach |
Większość przykładów w tym artykule jest asynchroniczna, używając odmian AsyncPageable<T>
typu. Korzystanie z programowania asynchronicznego dla operacji związanych z operacjami we/wy jest idealne. Idealny przypadek użycia używa asynchronicznych interfejsów API z zestawu Azure SDK dla platformy .NET, ponieważ te operacje reprezentują wywołania sieciowe HTTP/S.
Iterowanie za AsyncPageable
pomocą polecenia await foreach
Aby iterować AsyncPageable<T>
przy użyciu await foreach
składni, rozważmy następujący przykład:
async Task IterateSecretsWithAwaitForeachAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
}
}
W poprzednim kodzie języka C#:
- Metoda jest wywoływana SecretClient.GetPropertiesOfSecretsAsync i zwraca
AsyncPageable<SecretProperties>
obiekt. - W pętli każda
await foreach
SecretProperties
z nich jest asynchronicznie zwracana. - W miarę materializacji
Name
każdysecret
z nich jest zapisywany w konsoli programu .
Iterowanie za AsyncPageable
pomocą polecenia while
Aby iterować AsyncPageable<T>
w przypadku await foreach
niedostępnej składni, użyj while
pętli .
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();
}
}
W poprzednim kodzie języka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync jest wywoływana i zwraca
AsyncPageable<SecretProperties>
obiekt. - Metoda AsyncPageable<T>.GetAsyncEnumerator jest wywoływana, zwracając element
IAsyncEnumerator<SecretProperties>
. - Metoda MoveNextAsync() jest wywoływana wielokrotnie, dopóki nie ma elementów do zwrócenia.
Iterowanie na AsyncPageable
stronach
Jeśli chcesz kontrolować odbieranie stron wartości z usługi, użyj AsyncPageable<T>.AsPages
metody :
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);
}
}
W poprzednim kodzie języka C#:
- Metoda jest wywoływana SecretClient.GetPropertiesOfSecretsAsync i zwraca
AsyncPageable<SecretProperties>
obiekt. - Metoda AsyncPageable<T>.AsPages jest wywoływana i zwraca wartość
IAsyncEnumerable<Page<SecretProperties>>
. - Każda strona jest iteracja asynchronicznie przy użyciu metody
await foreach
. - Każda strona ma zestaw Page<T>.Values, który reprezentuje
IReadOnlyList<T>
iterytę z synchronicznymforeach
elementem . - Każda strona zawiera również element Page<T>.ContinuationToken, który może służyć do żądania następnej strony.
Używanie z usługą System.Linq.Async
AsyncPageable
Pakiet System.Linq.Async
zawiera zestaw metod LINQ , które działają na IAsyncEnumerable<T> typie. Ponieważ AsyncPageable<T>
implementuje IAsyncEnumerable<T>
element , można użyć System.Linq.Async
metody do wykonywania zapytań i przekształcania danych.
Konwertowanie na List<T>
Użyj ToListAsync
polecenia , aby przekonwertować element AsyncPageable<T>
na .List<T>
Ta metoda może wykonać kilka wywołań usługi, jeśli dane nie są zwracane na jednej stronie.
async Task ToListAsync()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
List<SecretProperties> secretList = await allSecrets.ToListAsync();
secretList.ForEach(secret =>
Console.WriteLine($"ToListAsync: {secret.Name}"));
}
W poprzednim kodzie języka C#:
- Metoda jest wywoływana SecretClient.GetPropertiesOfSecretsAsync i zwraca
AsyncPageable<SecretProperties>
obiekt. - Oczekiwana
ToListAsync
jest metoda, która zmaterializuje noweList<SecretProperties>
wystąpienie.
Weź pierwsze N elementów
Take
może służyć do pobierania tylko pierwszych N
elementów obiektu AsyncPageable
. Użycie Take
spowoduje, że najmniejsze wywołania usługi będą wymagane do pobrania N
elementów.
async Task TakeAsync(int count = 30)
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets.Take(count))
{
Console.WriteLine($"TakeAsync: {secret.Name}");
}
}
Więcej metod
System.Linq.Async
udostępnia inne metody, które zapewniają funkcjonalność równoważną ich synchronicznym Enumerable
odpowiednikom. Przykłady takich metod to Select
, , Where
OrderBy
i GroupBy
.
Uważaj na ocenę po stronie klienta
W przypadku korzystania z System.Linq.Async
pakietu należy pamiętać, że operacje LINQ są wykonywane na kliencie. Następujące zapytanie pobierze wszystkie elementy, aby je policzyć:
// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
await client.GetPropertiesOfSecretsAsync()
.CountAsync();
Ostrzeżenie
To samo ostrzeżenie dotyczy operatorów, takich jak Where
. Zawsze preferuj filtrowanie, agregację lub projekcje danych po stronie serwera, jeśli są dostępne.
Jako zauważalna sekwencja
Pakiet System.Linq.Async
jest używany głównie do zapewniania możliwości wzorca obserwatora w IAsyncEnumerable<T>
sekwencjach. Strumienie asynchroniczne są oparte na ściąganiu. Gdy ich elementy są iterowane, następny dostępny element jest ściągany. Takie podejście jest w połączeniu ze wzorcem obserwatora, który jest oparty na wypychaniach. Gdy elementy staną się dostępne, są one wypychane do subskrybentów, którzy pełnią rolę obserwatorów. Pakiet System.Linq.Async
udostępnia metodę ToObservable
rozszerzenia, która umożliwia konwertowanie IAsyncEnumerable<T>
elementu na element IObservable<T>
.
Wyobraź sobie implementację 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}");
}
Możesz użyć ToObservable
metody rozszerzenia w następujący sposób:
IDisposable UseTheToObservableMethod()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
IObservable<SecretProperties> observable = allSecrets.ToObservable();
return observable.Subscribe(
new SecretPropertyObserver());
}
W poprzednim kodzie języka C#:
- Metoda jest wywoływana SecretClient.GetPropertiesOfSecretsAsync i zwraca
AsyncPageable<SecretProperties>
obiekt. - Metoda
ToObservable()
jest wywoływana w wystąpieniuAsyncPageable<SecretProperties>
, zwracając elementIObservable<SecretProperties>
. - Element
observable
jest subskrybowany, przekazując implementację obserwatora, zwracając subskrypcję do elementu wywołującego. - Subskrypcja
IDisposable
to . Po usunięciu subskrypcja kończy się.
Iterowanie po stronie
Pageable<T>
to synchroniczna wersja AsyncPageable<T>
, która może być używana z normalną foreach
pętlą.
void IterateWithPageable()
{
Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();
foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateWithPageable: {secret.Name}");
}
}
Ważne
Chociaż ten synchroniczny interfejs API jest dostępny, użyj asynchronicznych alternatyw interfejsu API, aby uzyskać lepsze środowisko.