Compartir vía


ZipArchive.CreateAsync carga diligentemente entradas de archivo ZIP

ZipArchive.CreateAsync ahora carga diligentemente todas las entradas de archivo ZIP durante la llamada al método. Este cambio garantiza que el acceso a la ZipArchive.Entries propiedad no realice lecturas sincrónicas en la secuencia subyacente, que se alinea con patrones de programación asincrónicos.

Versión introducida

.NET 11 Preview 1

Comportamiento anterior

Anteriormente, al crear un ZipArchive mediante CreateAsync, el acceso a la propiedad Entries podría dar lugar a que se realizaran operaciones de lectura sincrónicas (bloqueando) en la secuencia subyacente. Este comportamiento era incoherente con la naturaleza asincrónica del CreateAsync método y podía provocar problemas con secuencias que no admiten lecturas sincrónicas.

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;

Nuevo comportamiento

A partir de .NET 11, el directorio central del archivo ZIP se lee de forma asincrónica como parte de la ZipArchive.CreateAsync llamada al método. Las excepciones relacionadas con entradas con formato incorrecto o problemas al leer el directorio central ahora se lanzan durante la llamada de CreateAsync. El acceso posterior a la Entries propiedad no realiza ninguna operación de lectura en la secuencia subyacente.

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;

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio se realizó para mejorar la coherencia y la confiabilidad al trabajar con flujos asincrónicos. Al cargar diligentemente las entradas durante la CreateAsync llamada, la API evita operaciones de lectura sincrónicas inesperadas más adelante. Evitar lecturas sincrónicas es especialmente importante para las secuencias que podrían acabar bloqueando hasta que los datos estén disponibles (como las secuencias de red). Esto se alinea con el diseño de la API aprobada y proporciona una experiencia de programación más predecible.

Para obtener más información, consulte dotnet/runtime#121938, dotnet/runtime#121624 y la explicación del diseño de la API.

Si su código usa ZipArchive.CreateAsync, asegúrese de controlar las excepciones de la llamada al método CreateAsync. Esta excepción ya se pudo producir en versiones anteriores de .NET (por ejemplo, cuando no se encuentra el directorio central ZIP), pero ahora también se produce para entradas con formato incorrecto que solo se detectaron anteriormente al acceder a la Entries propiedad.

Las APIs afectadas