Bagikan melalui


ZipArchive.CreateAsync dengan bersemangat memuat entri arsip ZIP

ZipArchive.CreateAsync sekarang secara otomatis memuat semua entri arsip ZIP selama panggilan metode. Perubahan ini memastikan bahwa mengakses properti ZipArchive.Entries tidak melakukan pembacaan secara sinkron pada aliran yang mendasarinya, yang selaras dengan pola pemrograman asinkron.

Versi yang diperkenalkan

.NET 11 Pratinjau 1

Perilaku sebelumnya

Sebelumnya, ketika Anda membuat ZipArchive menggunakan CreateAsync, mengakses properti Entries dapat mengakibatkan operasi baca pemblokiran sinkron yang dilakukan pada aliran dasar. Perilaku ini tidak konsisten dengan sifat asinkron dari CreateAsync metode dan dapat menyebabkan masalah dengan aliran yang tidak mendukung bacaan sinkron.

using System.IO;
using System.IO.Compression;

using var stream = new FileStream("archive.zip", FileMode.Open);
using var archive = await ZipArchive.CreateAsync(stream, ZipArchiveMode.Read);

// This call performs synchronous reads on the stream.
// Might throw if the file entries are malformed
// or if the stream doesn't support synchronous reads.
var entries = archive.Entries;

Perilaku baru

Mulai dari .NET 11, direktori pusat arsip ZIP dibaca secara asinkron sebagai bagian dari ZipArchive.CreateAsync panggilan metode. Setiap pengecualian yang terkait dengan entri cacat atau masalah membaca direktori pusat sekarang dilemparkan selama CreateAsync panggilan. Akses berikutnya ke properti Entries tidak melakukan operasi baca apa pun dari aliran data yang mendasari.

using System.IO;
using System.IO.Compression;

using var stream = new FileStream("archive.zip", FileMode.Open);

// This call eagerly loads the ZIP archive entries.
// Any exceptions related to malformed entries are surfaced here.
using var archive = await ZipArchive.CreateAsync(stream, ZipArchiveMode.Read);

// Accessing Entries no longer performs stream read operations.
var entries = archive.Entries;

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku.

Alasan perubahan

Perubahan ini dilakukan untuk meningkatkan konsistensi dan keandalan saat bekerja dengan aliran asinkron. Dengan bersemangat memuat entri saat panggilan CreateAsync, API mencegah operasi baca sinkron yang tidak terduga di kemudian hari. Menghindari bacaan sinkron sangat penting untuk aliran yang mungkin akhirnya memblokir hingga data tersedia (seperti aliran jaringan). Ini selaras dengan desain API yang disetujui dan memberikan pengalaman pemrograman yang lebih dapat diprediksi.

Untuk informasi selengkapnya, lihat dotnet/runtime#121938, dotnet/runtime#121624, dan diskusi desain API.

Jika kode Anda menggunakan ZipArchive.CreateAsync, pastikan Anda menangani pengecualian InvalidDataException yang berasal dari panggilan metode CreateAsync. Pengecualian ini sudah dapat dilemparkan dalam versi .NET sebelumnya (misalnya, ketika direktori pusat ZIP tidak dapat ditemukan), tetapi sekarang juga dilemparkan untuk entri cacat yang sebelumnya hanya ditemukan saat mengakses Entries properti.

API yang terpengaruh