Aracılığıyla paylaş


.NET için Azure SDK ile sayfalandırma

Bu makalede, büyük veri kümeleriyle verimli ve üretken bir şekilde çalışmak üzere .NET sayfalandırma işlevselliği için Azure SDK'sını kullanmayı öğreneceksiniz. Sayfalandırma, büyük veri kümelerini sayfalara bölerek tüketicinin daha az miktarda veride yineleme yapmasını kolaylaştırır. C# 8'den başlayarak, zaman uyumsuz (zaman uyumsuz) akışlar kullanarak akışları zaman uyumsuz olarak oluşturabilir ve kullanabilirsiniz. Zaman uyumsuz akışlar arabirimini IAsyncEnumerable<T> temel alır. .NET için Azure SDK, sınıfıyla AsyncPageable<T> uygulamasını IAsyncEnumerable<T> kullanıma sunar.

Bu makaledeki tüm örnekler aşağıdaki NuGet paketlerine dayanır:

.NET paketleri için Azure SDK'nın en son dizini için bkz . Azure SDK en son sürümleri.

Sayfalanabilir dönüş türleri

.NET için Azure SDK'dan örnek alınan istemciler aşağıdaki sayfalanabilir türleri döndürebilir.

Type Açıklama
Pageable<T> Sayfalarda alınan değer koleksiyonu
AsyncPageable<T> Sayfalarda zaman uyumsuz olarak alınan değerler koleksiyonu

Bu makaledeki örneklerin çoğu, türün varyasyonları AsyncPageable<T> kullanılarak zaman uyumsuz. G/Ç bağlı işlemler için zaman uyumsuz programlama kullanmak idealdir. Bu işlemler HTTP/S ağ çağrılarını temsil eden .NET için Azure SDK'sından zaman uyumsuz API'leri kullanmak mükemmel bir kullanım örneğidir.

ile yineleme AsyncPageableawait foreach

Söz dizimini await foreach kullanarak yinelemek AsyncPageable<T> için aşağıdaki örneği göz önünde bulundurun:

async Task IterateSecretsWithAwaitForeachAsync()
{
    AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();

    await foreach (SecretProperties secret in allSecrets)
    {
        Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
    }
}

Yukarıdaki C# kodunda:

  • SecretClient.GetPropertiesOfSecretsAsync yöntemi çağrılır ve bir AsyncPageable<SecretProperties> nesne döndürür.
  • Bir await foreach döngüde, her SecretProperties biri zaman uyumsuz olarak oluşturulur.
  • Her secret biri gerçekleştirilmiş olduğundan, Name konsola yazılır.

ile yineleme AsyncPageablewhile

Söz dizimi kullanılamadığında await foreach üzerinde AsyncPageable<T> yineleme yapmak için bir while döngü kullanın.

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();
    }
}

Yukarıdaki C# kodunda:

Sayfalar üzerinde AsyncPageable yineleme

Hizmetten değer sayfaları alma üzerinde denetim sahibi olmak istiyorsanız yöntemini kullanın 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);
    }
}

Yukarıdaki C# kodunda:

  • SecretClient.GetPropertiesOfSecretsAsync yöntemi çağrılır ve bir AsyncPageable<SecretProperties> nesne döndürür.
  • AsyncPageable<T>.AsPages yöntemi çağrılır ve döndürürIAsyncEnumerable<Page<SecretProperties>>.
  • Her sayfa kullanılarak await foreachzaman uyumsuz olarak yinelenir.
  • Her sayfada, zaman uyumlu foreachbir ile yinelenen bir IReadOnlyList<T> öğesini temsil eden bir kümesi Page<T>.Valuesvardır.
  • Her sayfada bir sonraki sayfayı istemek için kullanılabilecek bir Page<T>.ContinuationTokende bulunur.

Ile kullanma System.Linq.AsyncAsyncPageable

Paket, System.Linq.Async türü üzerinde IAsyncEnumerable<T> çalışan bir dizi LINQ yöntemi sağlar. AsyncPageable<T> uyguladığındanIAsyncEnumerable<T>, kullanarak verileri sorgulayabilir ve dönüştürebilirsinizSystem.Linq.Async.

Dönüştür: List<T>

öğesini AsyncPageable<T> öğesine dönüştürmek için List<T>kullanınToListAsync. Bu yöntem, veriler tek bir sayfada döndürülmezse birkaç hizmet çağrısı yapabilir.

async Task ToListAsync()
{
    AsyncPageable<SecretProperties> allSecrets =
        client.GetPropertiesOfSecretsAsync();

    List<SecretProperties> secretList = await allSecrets.ToListAsync();

    secretList.ForEach(secret =>
        Console.WriteLine($"ToListAsync: {secret.Name}"));
}

Yukarıdaki C# kodunda:

  • SecretClient.GetPropertiesOfSecretsAsync yöntemi çağrılır ve bir AsyncPageable<SecretProperties> nesne döndürür.
  • Yeni ToListAsync bir List<SecretProperties> örneği gerçekleştiren yöntemi beklenilir.

İlk N öğelerini alma

Take yalnızca ilk N öğelerini AsyncPageablealmak için kullanılabilir. kullanmak Take , öğeleri almak N için gereken en az hizmet çağrısını yapar.

async Task TakeAsync(int count = 30)
{
    AsyncPageable<SecretProperties> allSecrets =
        client.GetPropertiesOfSecretsAsync();

    await foreach (SecretProperties secret in allSecrets.Take(count))
    {
        Console.WriteLine($"TakeAsync: {secret.Name}");
    }
}

Diğer yöntemler

System.Linq.Async , zaman uyumlu Enumerable karşılıklarına eşdeğer işlevler sağlayan diğer yöntemler sağlar. Bu tür yöntemlere örnek olarak Select, Where, OrderByve GroupByverilebilir.

İstemci tarafı değerlendirmesine dikkat edin

Paketi kullanırken System.Linq.Async , LINQ işlemlerinin istemcide yürütüldüğünü dikkate alın. Aşağıdaki sorgu, yalnızca saymak için tüm öğeleri getirir:

// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
    await client.GetPropertiesOfSecretsAsync()
        .CountAsync();

Uyarı

Aynı uyarı gibi Whereişleçler için de geçerlidir. Varsa her zaman sunucu tarafı filtrelemeyi, toplamayı veya veri projeksiyonlarını tercih edin.

Gözlemlenebilir bir dizi olarak

System.Linq.Async Paket öncelikli olarak sıralar üzerinde IAsyncEnumerable<T> gözlemci deseni özellikleri sağlamak için kullanılır. Zaman uyumsuz akışlar çekme tabanlıdır. Öğeleri yinelendiğinden, bir sonraki kullanılabilir öğe çekilir. Bu yaklaşım, itme temelli gözlemci deseni ile birlikte iki durumludur. Öğeler kullanılabilir hale geldikçe, gözlemci görevi gören abonelere gönderilebilir. paket, System.Linq.Async bir IAsyncEnumerable<T>IObservable<T>'i ToObservable öğesine dönüştürmenize olanak tanıyan uzantı yöntemini sağlar.

Bir IObserver<SecretProperties> uygulama düşünün:

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}");
}

Uzantı yöntemini aşağıdaki gibi kullanabilirsiniz ToObservable :

IDisposable UseTheToObservableMethod()
{
    AsyncPageable<SecretProperties> allSecrets =
        client.GetPropertiesOfSecretsAsync();

    IObservable<SecretProperties> observable = allSecrets.ToObservable();

    return observable.Subscribe(
        new SecretPropertyObserver());
}

Yukarıdaki C# kodunda:

  • SecretClient.GetPropertiesOfSecretsAsync yöntemi çağrılır ve bir AsyncPageable<SecretProperties> nesne döndürür.
  • ToObservable() yöntemi örnekte çağrılır AsyncPageable<SecretProperties> ve bir IObservable<SecretProperties>döndürür.
  • observable öğesine abone olur ve gözlemci uygulamasını geçirir ve aboneliği çağırana döndürür.
  • Abonelik bir IDisposable'dir. Kullanımdan kaldırıldığında abonelik sona erer.

Sayfalanabilir üzerinde yineleme

Pageable<T>, normal foreach bir döngüyle kullanılabilen zaman uyumlu bir sürümüdürAsyncPageable<T>.

void IterateWithPageable()
{
    Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();

    foreach (SecretProperties secret in allSecrets)
    {
        Console.WriteLine($"IterateWithPageable: {secret.Name}");
    }
}

Önemli

Bu zaman uyumlu API kullanılabilir durumdayken, daha iyi bir deneyim için zaman uyumsuz API alternatiflerini kullanın.

Ayrıca bkz.