Lapozás a .NET-hez készült Azure SDK-val
Ebből a cikkből megtudhatja, hogyan használhatja az Azure SDK for .NET lapozási funkcióját a nagy adatkészletek hatékony és hatékony használatához. A lapozás a nagy adathalmazok lapokra való felosztása, ami megkönnyíti a fogyasztó számára a kisebb adatmennyiségek iterálását. A C# 8-tól kezdve aszinkron módon hozhat létre és használhat streameket aszinkron (aszinkron) streamekkel. Az aszinkron streamek az IAsyncEnumerable<T> interfészen alapulnak. Az Azure SDK for .NET az osztályával teszi elérhetővé a IAsyncEnumerable<T>
megvalósítást AsyncPageable<T>
.
A cikkben szereplő összes minta a következő NuGet-csomagokra támaszkodik:
- Azure.Security.KeyVault.Secrets
- Microsoft.Extensions.Azure
- Microsoft.Extensions.Hosting
- System.Linq.Async
A .NET-csomagokhoz készült Azure SDK legújabb könyvtárát az Azure SDK legújabb kiadásaiban talál.
Lapozható visszatérési típusok
A .NET-hez készült Azure SDK-ból példányosított ügyfelek a következő lapozható típusokat adhatják vissza.
Típus | Leírás |
---|---|
Pageable<T> |
Lapokban lekért értékek gyűjteménye |
AsyncPageable<T> |
A lapokban aszinkron módon lekért értékek gyűjteménye |
A cikkben szereplő minták többsége aszinkron, a AsyncPageable<T>
típus variációit használva. Az Aszinkron programozás használata az I/O-kötött műveletekhez ideális. Tökéletes használati eset az Azure SDK for .NET aszinkron API-inak használata, mivel ezek a műveletek HTTP/S hálózati hívásokat jelölnek.
Iterálás a AsyncPageable
await foreach
A szintaxis használatával await foreach
történő iteráláshoz AsyncPageable<T>
vegye figyelembe a következő példát:
async Task IterateSecretsWithAwaitForeachAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
}
}
Az előző C# kódban:
- A SecretClient.GetPropertiesOfSecretsAsync metódus meghívása és visszaadja az objektumot
AsyncPageable<SecretProperties>
. await foreach
Egy hurokban mindegyikSecretProperties
aszinkron módon lesz kihozva.- Mivel mindegyik
secret
materializálva van, aName
konzolra lesz írva.
Iterálás a AsyncPageable
while
Ha át szeretne iterálni egy AsyncPageable<T>
olyan állapoton, amelynél a await foreach
szintaxis nem érhető el, használjon hurkot 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();
}
}
Az előző C# kódban:
- A SecretClient.GetPropertiesOfSecretsAsync metódus meghívása egy objektumot ad
AsyncPageable<SecretProperties>
vissza. - A AsyncPageable<T>.GetAsyncEnumerator metódus meghívása
IAsyncEnumerator<SecretProperties>
egy . - A MoveNextAsync() metódust többször is meghívja a rendszer, amíg nem lesz visszaküldött elem.
Iterálás több oldalon keresztül AsyncPageable
Ha szabályozni szeretné, hogy a szolgáltatástól több oldalnyi értéket fogadjon, használja a AsyncPageable<T>.AsPages
következő módszert:
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);
}
}
Az előző C# kódban:
- A SecretClient.GetPropertiesOfSecretsAsync metódus meghívása és visszaadja az objektumot
AsyncPageable<SecretProperties>
. - A AsyncPageable<T>.AsPages metódus meghívása és visszaadása egy
IAsyncEnumerable<Page<SecretProperties>>
. - Minden oldal aszinkron módon van iterálva, a használatával
await foreach
. - Minden lap rendelkezik egy készlettel Page<T>.Values, amely egy
IReadOnlyList<T>
szinkronnalforeach
átfutott oldalt jelöl. - Minden lap tartalmaz egy Page<T>.ContinuationToken, amely a következő lap igénylésére használható.
Használat a következővel System.Linq.Async
: AsyncPageable
A System.Linq.Async
csomag a típuson IAsyncEnumerable<T> működő LINQ-metódusok készletét biztosítja. Mivel AsyncPageable<T>
implementálva IAsyncEnumerable<T>
van, az adatok lekérdezésére és átalakítására is használható System.Linq.Async
.
Konvertálás List<T>
Segítségével ToListAsync
átalakíthat egy AsyncPageable<T>
List<T>
. Ez a módszer több szolgáltatáshívást is kezdeményezhet, ha az adatokat nem adják vissza egyetlen oldalon.
async Task ToListAsync()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
List<SecretProperties> secretList = await allSecrets.ToListAsync();
secretList.ForEach(secret =>
Console.WriteLine($"ToListAsync: {secret.Name}"));
}
Az előző C# kódban:
- A SecretClient.GetPropertiesOfSecretsAsync metódus meghívása és visszaadja az objektumot
AsyncPageable<SecretProperties>
. - A
ToListAsync
metódusra vár, amely egy újList<SecretProperties>
példányt hoz létre.
Az első N elemek átvétele
Take
csak a . első N
elemeinek lekérésére AsyncPageable
használható. A használat során Take
a legkevesebb szolgáltatáshívás szükséges az elemek lekéréséhez 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}");
}
}
További módszerek
System.Linq.Async
más módszereket is biztosít, amelyek a szinkron Enumerable
megfelelőiknek megfelelő funkciókat biztosítják. Ilyen módszerek például a Select
következők: , Where
, OrderBy
és GroupBy
.
Beware ügyféloldali kiértékelés
A csomag használatakor ügyeljen arra, hogy a System.Linq.Async
LINQ-műveletek végrehajtása az ügyfélen történik. A következő lekérdezés lekéri az összes elemet csak a megszámlálásukhoz:
// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
await client.GetPropertiesOfSecretsAsync()
.CountAsync();
Figyelmeztetés
Ugyanez a figyelmeztetés az olyan operátorokra vonatkozik, mint a Where
. Mindig előnyben részesíti a kiszolgálóoldali szűrést, az összesítést vagy az adatok előrejelzését, ha van ilyen.
Megfigyelhető sorozatként
A System.Linq.Async
csomag elsősorban megfigyelői mintaképességek biztosítására szolgál szekvenciákon keresztül IAsyncEnumerable<T>
. Az aszinkron streamek lekéréses alapúak. Az elemek iterated over, the next available item is pulled. Ez a megközelítés a megfigyelői mintával van összefüggésben, amely push-alapú. Amint az elemek elérhetővé válnak, a rendszer leküldi azokat az előfizetőknek, akik megfigyelőként működnek. A System.Linq.Async
csomag tartalmazza azt a ToObservable
bővítménymetódust, amellyel átalakíthat egy IAsyncEnumerable<T>
IObservable<T>
.
Képzeljen el egy implementációt 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}");
}
A bővítménymetódus az ToObservable
alábbiak szerint használható:
IDisposable UseTheToObservableMethod()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
IObservable<SecretProperties> observable = allSecrets.ToObservable();
return observable.Subscribe(
new SecretPropertyObserver());
}
Az előző C# kódban:
- A SecretClient.GetPropertiesOfSecretsAsync metódus meghívása és visszaadja az objektumot
AsyncPageable<SecretProperties>
. - A
ToObservable()
metódus meghívása aAsyncPageable<SecretProperties>
példányon történik, és egyIObservable<SecretProperties>
. - A
observable
rendszer előfizet a megfigyelői megvalósításra, és visszaadja az előfizetést a hívónak. - Az előfizetés egy
IDisposable
. A megsemmisítés után az előfizetés véget ér.
Iterátum lapozható
Pageable<T>
egy szinkron verziója AsyncPageable<T>
, amely normál foreach
hurokkal használható.
void IterateWithPageable()
{
Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();
foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateWithPageable: {secret.Name}");
}
}
Fontos
Bár ez a szinkron API elérhető, használja az aszinkron API-alternatívákat a jobb élmény érdekében.