Acara
Ikuti Tantangan Microsoft Learn
19 Nov, 23 - 10 Jan, 23
Ignite Edition - Bangun keterampilan di Microsoft Azure dan dapatkan lencana digital paling lama 10 Januari!
Daftar sekarangBrowser ini sudah tidak didukung.
Mutakhirkan ke Microsoft Edge untuk memanfaatkan fitur, pembaruan keamanan, dan dukungan teknis terkini.
Dalam artikel ini, Anda akan mempelajari cara menggunakan fungsionalitas paginasi Azure SDK for .NET untuk bekerja secara efisien dan produktif dengan himpunan data besar. Penomoran halaman adalah tindakan membalik himpunan data besar ke dalam halaman, sehingga memudahkan konsumen untuk melakukan iterasi melalui jumlah data yang lebih kecil. Dimulai dengan C# 8, Anda dapat membuat dan mengonsumsi aliran secara asinkron menggunakan aliran Asinkron (asinkron). Aliran asinkron didasarkan pada IAsyncEnumerable<T> antarmuka. Azure SDK untuk .NET mengekspos implementasi IAsyncEnumerable<T>
dengan kelasnya AsyncPageable<T>
.
Semua sampel dalam artikel ini mengandalkan paket NuGet berikut:
Untuk direktori terbaru Azure SDK untuk paket .NET, lihat Rilis terbaru Azure SDK.
Klien yang dibuat dari Azure SDK untuk .NET dapat mengembalikan jenis yang dapat di-pageable berikut.
Tipe | Deskripsi |
---|---|
Pageable<T> |
Kumpulan nilai yang diambil dalam halaman |
AsyncPageable<T> |
Kumpulan nilai yang diambil secara asinkron di halaman |
Sebagian besar sampel dalam artikel ini bersifat asinkron, menggunakan variasi jenisnya AsyncPageable<T>
. Menggunakan pemrograman asinkron untuk operasi terikat I/O sangat ideal. Kasus penggunaan yang sempurna menggunakan API asinkron dari Azure SDK untuk .NET karena operasi ini mewakili panggilan jaringan HTTP/S.
Untuk melakukan iterasi melalui AsyncPageable<T>
menggunakan await foreach
sintaks, pertimbangkan contoh berikut:
async Task IterateSecretsWithAwaitForeachAsync()
{
AsyncPageable<SecretProperties> allSecrets = client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateSecretsWithAwaitForeachAsync: {secret.Name}");
}
}
Dalam kode C# sebelumnya:
AsyncPageable<SecretProperties>
objek.await foreach
, masing-masing SecretProperties
secara asinkron dihasilkan.Name
masing-masing secret
ditulis ke konsol.Untuk mengulangi AsyncPageable<T>
saat await foreach
sintaks tidak tersedia, gunakan perulangan 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();
}
}
Dalam kode C# sebelumnya:
AsyncPageable<SecretProperties>
objek.IAsyncEnumerator<SecretProperties>
.Jika Anda ingin mengontrol penerimaan halaman nilai dari layanan, gunakan AsyncPageable<T>.AsPages
metode :
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);
}
}
Dalam kode C# sebelumnya:
AsyncPageable<SecretProperties>
objek.IAsyncEnumerable<Page<SecretProperties>>
.await foreach
.IReadOnlyList<T>
yang diulang dengan sinkron foreach
.Paket ini System.Linq.Async
menyediakan serangkaian metode LINQ yang beroperasi pada IAsyncEnumerable<T> jenis. Karena AsyncPageable<T>
mengimplementasikan IAsyncEnumerable<T>
, Anda dapat menggunakan System.Linq.Async
untuk mengkueri dan mengubah data.
Gunakan ToListAsync
untuk mengonversi AsyncPageable<T>
ke List<T>
. Metode ini mungkin melakukan beberapa panggilan layanan jika data tidak dikembalikan dalam satu halaman.
async Task ToListAsync()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
List<SecretProperties> secretList = await allSecrets.ToListAsync();
secretList.ForEach(secret =>
Console.WriteLine($"ToListAsync: {secret.Name}"));
}
Dalam kode C# sebelumnya:
AsyncPageable<SecretProperties>
objek.ToListAsync
ini ditunggu, yang mewujudkan instans baru List<SecretProperties>
.Take
hanya dapat digunakan untuk mendapatkan elemen pertama N
dari AsyncPageable
. Menggunakan Take
akan melakukan panggilan layanan terkecil yang diperlukan untuk mendapatkan N
item.
async Task TakeAsync(int count = 30)
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
await foreach (SecretProperties secret in allSecrets.Take(count))
{
Console.WriteLine($"TakeAsync: {secret.Name}");
}
}
System.Linq.Async
menyediakan metode lain yang menyediakan fungsionalitas yang setara dengan rekan-rekan sinkron Enumerable
mereka. Contoh metode tersebut termasuk Select
, , Where
, OrderBy
dan GroupBy
.
Saat menggunakan System.Linq.Async
paket, waspadalah bahwa operasi LINQ dijalankan pada klien. Kueri berikut akan mengambil semua item hanya untuk menghitungnya:
// ⚠️ DON'T DO THIS! 😲
int expensiveSecretCount =
await client.GetPropertiesOfSecretsAsync()
.CountAsync();
Peringatan
Peringatan yang sama berlaku untuk operator seperti Where
. Selalu pilih pemfilteran, agregasi, atau proyeksi data sisi server jika tersedia.
Paket System.Linq.Async
ini terutama digunakan untuk memberikan kemampuan pola pengamat atas IAsyncEnumerable<T>
urutan. Aliran asinkron berbasis pull. Saat item mereka diulang, item berikutnya yang tersedia akan ditarik. Pendekatan ini berada dalam juxtaposition dengan pola pengamat, yang berbasis dorong. Saat item tersedia, item akan didorong ke pelanggan yang bertindak sebagai pengamat. Paket ini System.Linq.Async
menyediakan ToObservable
metode ekstensi yang memungkinkan Anda mengonversi IAsyncEnumerable<T>
ke IObservable<T>
.
Bayangkan implementasi 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}");
}
Anda dapat menggunakan ToObservable
metode ekstensi sebagai berikut:
IDisposable UseTheToObservableMethod()
{
AsyncPageable<SecretProperties> allSecrets =
client.GetPropertiesOfSecretsAsync();
IObservable<SecretProperties> observable = allSecrets.ToObservable();
return observable.Subscribe(
new SecretPropertyObserver());
}
Dalam kode C# sebelumnya:
AsyncPageable<SecretProperties>
objek.ToObservable()
ini dipanggil pada AsyncPageable<SecretProperties>
instans, mengembalikan IObservable<SecretProperties>
.observable
berlangganan, meneruskan implementasi pengamat, mengembalikan langganan ke pemanggil.IDisposable
. Saat dibuang, langganan berakhir.Pageable<T>
adalah versi sinkron yang AsyncPageable<T>
dapat digunakan dengan perulangan normal foreach
.
void IterateWithPageable()
{
Pageable<SecretProperties> allSecrets = client.GetPropertiesOfSecrets();
foreach (SecretProperties secret in allSecrets)
{
Console.WriteLine($"IterateWithPageable: {secret.Name}");
}
}
Penting
Meskipun API sinkron ini tersedia, gunakan alternatif API asinkron untuk pengalaman yang lebih baik.
Umpan balik .NET
.NET adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik:
Acara
Ikuti Tantangan Microsoft Learn
19 Nov, 23 - 10 Jan, 23
Ignite Edition - Bangun keterampilan di Microsoft Azure dan dapatkan lencana digital paling lama 10 Januari!
Daftar sekarangPelatihan
Modul
Pelajari cara membuat variabel array dan melakukan iterasi melalui elemen array.
Dokumentasi