Stránkování pomocí sady Azure SDK pro .NET
V tomto článku se dozvíte, jak používat funkci stránkování sady Azure SDK pro .NET k efektivní a produktivní práci s velkými datovými sadami. Stránkování je rozdělení velkých datových sad na stránky, což usnadňuje uživatelům iteraci menšími objemy dat. Počínaje jazykem C# 8 můžete vytvářet a využívat streamy asynchronně pomocí asynchronních (asynchronních) datových proudů. Asynchronní streamy jsou založené na IAsyncEnumerable<T> rozhraní. Sada Azure SDK pro .NET zveřejňuje implementaci IAsyncEnumerable<T>
s její AsyncPageable<T>
třídou.
Všechny ukázky v tomto článku se spoléhají na následující balíčky NuGet:
- Azure.Security.KeyVault.Secrets
- Microsoft.Extensions.Azure
- Microsoft.Extensions.Hosting
- System.Linq.Async
Nejnovější adresář sady Azure SDK pro balíčky .NET najdete v nejnovějších verzích sady Azure SDK.
Návratové typy s možností stránky
Klienti, kteří vytvořili instanci ze sady Azure SDK pro .NET, můžou vrátit následující stránkovatelné typy.
Typ | Popis |
---|---|
Pageable<T> |
Kolekce hodnot načtených na stránkách |
AsyncPageable<T> |
Kolekce hodnot asynchronně načtených na stránkách |
Většina ukázek v tomto článku je asynchronní a používá varianty AsyncPageable<T>
typu. Použití asynchronního programování pro vstupně-výstupní operace je ideální. Dokonalý případ použití používá asynchronní rozhraní API ze sady Azure SDK pro .NET, protože tyto operace představují síťová volání HTTP/S.
Iterace s využitím AsyncPageable
await foreach
Pokud chcete iterovat syntaxi AsyncPageable<T>
pomocí await foreach
, zvažte následující příklad:
async Task IterateSecretsWithAwaitForeachAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
}
}
V předchozím kódu jazyka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync je vyvolána a vrátí
AsyncPageable<SecretProperties>
objekt. await foreach
Ve smyčce je každýSecretProperties
asynchronně výnosný.- Vzhledem k tomu, že každý
secret
je materializován, jeName
zapsán do konzoly.
Iterace s využitím AsyncPageable
while
Pokud chcete iterovat, AsyncPageable<T>
když await foreach
syntaxe není dostupná, použijte smyčku while
.
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();
}
}
V předchozím kódu jazyka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync je vyvolána a vrátí
AsyncPageable<SecretProperties>
objekt. - Metoda AsyncPageable<T>.GetAsyncEnumerator je vyvolána a vrací .
IAsyncEnumerator<SecretProperties>
- Metoda MoveNextAsync() je vyvolána opakovaně, dokud nejsou k dispozici žádné položky k vrácení.
Iterace přes AsyncPageable
stránky
Pokud chcete mít kontrolu nad příjmem stránek hodnot ze služby, použijte metodu AsyncPageable<T>.AsPages
:
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);
}
}
V předchozím kódu jazyka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync je vyvolána a vrátí
AsyncPageable<SecretProperties>
objekt. - Metoda AsyncPageable<T>.AsPages je vyvolána a vrátí .
IAsyncEnumerable<Page<SecretProperties>>
- Každá stránka se itestruje asynchronně pomocí .
await foreach
- Každá stránka má sadu Page<T>.Values, která představuje
IReadOnlyList<T>
iterated přes synchronníforeach
. - Každá stránka také obsahuje , Page<T>.ContinuationTokenkterý lze použít k vyžádání další stránky.
Použití s System.Linq.Async
AsyncPageable
Balíček System.Linq.Async
poskytuje sadu metod LINQ , které pracují s typem IAsyncEnumerable<T> . Vzhledem k tomu AsyncPageable<T>
, že implementuje IAsyncEnumerable<T>
, můžete použít System.Linq.Async
k dotazování a transformaci dat.
Převést na List<T>
Slouží ToListAsync
k převodu na AsyncPageable<T>
.List<T>
Tato metoda může volat několik služeb, pokud se data nevrátí na jedné stránce.
async Task ToListAsync()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
List<SecretProperties> secretList = await allSecrets.ToListAsync();
secretList.ForEach(secret =>
Console.WriteLine($"ToListAsync: {secret.Name}"));
}
V předchozím kódu jazyka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync je vyvolána a vrátí
AsyncPageable<SecretProperties>
objekt. - Očekává se
ToListAsync
metoda, která materializuje novouList<SecretProperties>
instanci.
Vezměte první prvky N.
Take
lze použít k získání pouze prvních N
prvků AsyncPageable
. Použití Take
provede nejmenší volání služby potřebné k získání N
položek.
async Task TakeAsync(int count = 30)
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets.Take(count))
{
Console.WriteLine($"TakeAsync: {secret.Name}");
}
}
Další metody
System.Linq.Async
poskytuje další metody, které poskytují funkce ekvivalentní jejich synchronním Enumerable
protějškům. Mezi příklady takových metod patří Select
, Where
, OrderBy
, a GroupBy
.
Vyhodnocení na straně klienta
Při použití System.Linq.Async
balíčku si dávejte pozor, aby se na klientovi spouštěly operace LINQ. Následující dotaz načte všechny položky, které se mají spočítat:
// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
await client.GetPropertiesOfSecretsAsync()
.CountAsync();
Upozorňující
Stejné upozornění platí pro operátory, jako je Where
. Vždy preferujte filtrování, agregaci nebo projekce dat na straně serveru, pokud jsou k dispozici.
Jako pozorovatelná posloupnost
Balíček System.Linq.Async
se primárně používá k poskytování funkcí vzorů pozorovatele v sekvencích IAsyncEnumerable<T>
. Asynchronní datové proudy jsou založené na vyžádání. S tím, jak jsou jejich položky iterated, další dostupná položka se načítá. Tento přístup je v juxtapozici se vzorem pozorovatele, který je založený na zápisu. Jakmile budou položky k dispozici, budou nasdílené odběratelům, kteří fungují jako pozorovatelé. Balíček System.Linq.Async
poskytuje rozšiřující metoduToObservable
, která umožňuje převést na IAsyncEnumerable<T>
.IObservable<T>
Představte si implementaci 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}");
}
Metodu ToObservable
rozšíření můžete využít následujícím způsobem:
IDisposable UseTheToObservableMethod()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
IObservable<SecretProperties> observable = allSecrets.ToObservable();
return observable.Subscribe(
new SecretPropertyObserver());
}
V předchozím kódu jazyka C#:
- Metoda SecretClient.GetPropertiesOfSecretsAsync je vyvolána a vrátí
AsyncPageable<SecretProperties>
objekt. - Metoda
ToObservable()
je volána vAsyncPageable<SecretProperties>
instanci a vrací .IObservable<SecretProperties>
- Odběr
observable
se přihlásí, předá implementaci pozorovatele a vrátí předplatné volajícímu. - Předplatné je .
IDisposable
Jakmile se odstraní, předplatné skončí.
Iterace přes stránkovatelné
Pageable<T>
je synchronní verze AsyncPageable<T>
, kterou lze použít s normální foreach
smyčkou.
void IterateWithPageable()
{
Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();
foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateWithPageable: {secret.Name}");
}
}
Důležité
I když je toto synchronní rozhraní API k dispozici, pro lepší prostředí využijte alternativy asynchronního rozhraní API.