Megosztás a következőn keresztül:


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:

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 AsyncPageableawait 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 mindegyik SecretProperties aszinkron módon lesz kihozva.
  • Mivel mindegyik secret materializálva van, a Name konzolra lesz írva.

Iterálás a AsyncPageablewhile

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:

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> szinkronnal foreachá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 új List<SecretProperties> példányt hoz létre.

Az első N elemek átvétele

Take csak a . első N elemeinek lekérésére AsyncPageablehaszná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 Selectkö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 a AsyncPageable<SecretProperties> példányon történik, és egy IObservable<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.

Lásd még