.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:
- Azure.Security.KeyVault.Secrets
- Microsoft.Extensions.Azure
- Microsoft.Extensions.Hosting
- System.Linq.Async
.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 AsyncPageable
await 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, herSecretProperties
biri zaman uyumsuz olarak oluşturulur. - Her
secret
biri gerçekleştirilmiş olduğundan,Name
konsola yazılır.
ile yineleme AsyncPageable
while
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:
- SecretClient.GetPropertiesOfSecretsAsync yöntemi çağrılır ve bir
AsyncPageable<SecretProperties>
nesne döndürür. - AsyncPageable<T>.GetAsyncEnumerator yöntemi çağrılır ve bir
IAsyncEnumerator<SecretProperties>
döndürür. - Yöntemi MoveNextAsync() , döndürülecek öğe kalmayıncaya kadar tekrar tekrar çağrılır.
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ür
IAsyncEnumerable<Page<SecretProperties>>
. - Her sayfa kullanılarak
await foreach
zaman uyumsuz olarak yinelenir. - Her sayfada, zaman uyumlu
foreach
bir ile yinelenen birIReadOnlyList<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.Async
AsyncPageable
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
birList<SecretProperties>
örneği gerçekleştiren yöntemi beklenilir.
İlk N öğelerini alma
Take
yalnızca ilk N
öğelerini AsyncPageable
almak 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
, OrderBy
ve GroupBy
verilebilir.
İ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 Where
iş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ırAsyncPageable<SecretProperties>
ve birIObservable<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.