Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
ZipArchive.CreateAsync charge désormais avec impatience toutes les entrées d’archive ZIP pendant l’appel de méthode. Cette modification garantit que l’accès à la ZipArchive.Entries propriété n’effectue pas de lectures synchrones sur le flux sous-jacent, qui s’aligne sur les modèles de programmation asynchrones.
Version introduite
.NET 11 Preview 1
Comportement précédent
Auparavant, lorsque vous créez une ZipArchive en utilisant CreateAsync, l'accès à Entries pouvait entraîner des opérations de lecture synchrones (bloquantes) effectuées sur le flux sous-jacent. Ce comportement était incohérent avec la nature asynchrone de la CreateAsync méthode et pouvait provoquer des problèmes avec les flux qui ne prennent pas en charge les lectures synchrones.
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;
Nouveau comportement
À compter de .NET 11, le répertoire central de l’archive ZIP est lu de manière asynchrone dans le cadre de l’appel ZipArchive.CreateAsync de méthode. Toutes les exceptions liées aux entrées incorrectes ou aux problèmes de lecture du répertoire central sont désormais levées pendant l’appel CreateAsync . L’accès ultérieur à la Entries propriété n’effectue aucune opération de lecture sur le flux sous-jacent.
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;
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification a été apportée pour améliorer la cohérence et la fiabilité lors de l’utilisation de flux asynchrones. En chargeant avec impatience les entrées pendant l’appel CreateAsync , l’API évite les opérations de lecture synchrones inattendues ultérieurement. L’évitement des lectures synchrones est particulièrement importante pour les flux susceptibles de se retrouver bloqués jusqu’à ce que les données soient disponibles (par exemple, les flux réseau). Cela s’aligne sur la conception d’API approuvée et offre une expérience de programmation plus prévisible.
Pour plus d’informations, consultez dotnet/runtime#121938, dotnet/runtime#121624 et la discussion sur la conception d’API.
Action recommandée
Si votre code utilise ZipArchive.CreateAsync, assurez-vous de gérer les InvalidDataException exceptions de l’appel CreateAsync de méthode. Cette exception peut déjà être levée dans les versions précédentes de .NET (par exemple, lorsque le répertoire central ZIP est introuvable), mais elle est également levée pour les entrées incorrectes qui étaient précédemment découvertes uniquement lors de l’accès à la Entries propriété.