Zdarzenia
Weź udział w wyzwaniu Microsoft Learn
19 lis, 23 - 10 sty, 23
Ignite Edition — rozwijanie umiejętności na platformie Microsoft Azure i zdobywanie znaczka cyfrowego do 10 stycznia!
Zarejestruj się terazTa przeglądarka nie jest już obsługiwana.
Przejdź na przeglądarkę Microsoft Edge, aby korzystać z najnowszych funkcji, aktualizacji zabezpieczeń i pomocy technicznej.
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:
Najnowsze wersje zestawu Azure SDK dla platformy .NET można znaleźć w artykule Azure SDK latest releases (Najnowsze wersje zestawu Azure SDK).
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.
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#:
AsyncPageable<SecretProperties>
obiekt.await foreach
SecretProperties
z nich jest asynchronicznie zwracana.Name
każdy secret
z nich jest zapisywany w konsoli programu .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#:
AsyncPageable<SecretProperties>
obiekt.IAsyncEnumerator<SecretProperties>
.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#:
AsyncPageable<SecretProperties>
obiekt.IAsyncEnumerable<Page<SecretProperties>>
.await foreach
.IReadOnlyList<T>
iterytę z synchronicznym foreach
elementem .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.
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#:
AsyncPageable<SecretProperties>
obiekt.ToListAsync
jest metoda, która zmaterializuje nowe List<SecretProperties>
wystąpienie.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}");
}
}
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
.
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.
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#:
AsyncPageable<SecretProperties>
obiekt.ToObservable()
jest wywoływana w wystąpieniu AsyncPageable<SecretProperties>
, zwracając element IObservable<SecretProperties>
.observable
jest subskrybowany, przekazując implementację obserwatora, zwracając subskrypcję do elementu wywołującego.IDisposable
to . Po usunięciu subskrypcja kończy się.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.
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię:
Zdarzenia
Weź udział w wyzwaniu Microsoft Learn
19 lis, 23 - 10 sty, 23
Ignite Edition — rozwijanie umiejętności na platformie Microsoft Azure i zdobywanie znaczka cyfrowego do 10 stycznia!
Zarejestruj się terazSzkolenie
Moduł
Dowiedz się, jak tworzyć zmienne tablicowe i iterować przez elementy tablicy.