Delen via


ZipArchive.CreateAsync laadt graag ZIP-archiefvermeldingen

ZipArchive.CreateAsync laadt nu graag alle ZIP-archiefvermeldingen tijdens de methode-aanroep. Deze wijziging zorgt ervoor dat bij het openen van de ZipArchive.Entries eigenschap geen synchrone leesbewerkingen worden uitgevoerd op de onderliggende stroom, die overeenkomt met asynchrone programmeerpatronen.

Geïntroduceerde versie

.NET 11 Preview 1

Vorig gedrag

Toen u eerder een ZipArchive hebt gemaakt met behulp van CreateAsync, kan toegang tot de Entries-eigenschap ertoe leiden dat synchrone (blokkerende) leesbewerkingen worden uitgevoerd op de onderliggende stroom. Dit gedrag is inconsistent met de asynchrone aard van de CreateAsync methode en kan problemen veroorzaken met streams die geen ondersteuning bieden voor synchrone leesbewerkingen.

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;

Nieuw gedrag

Vanaf .NET 11 wordt de centrale map van het ZIP-archief asynchroon gelezen als onderdeel van de ZipArchive.CreateAsync methodeaanroep. Eventuele uitzonderingen met betrekking tot ongeldige vermeldingen of problemen bij het lezen van de centrale directory worden nu gegenereerd tijdens de CreateAsync-aanroep. Volgende toegang tot de Entries eigenschap voert geen leesbewerkingen uit op de onderliggende stroom.

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 van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging is aangebracht om de consistentie en betrouwbaarheid te verbeteren bij het werken met asynchrone streams. Door vermeldingen tijdens de CreateAsync aanroep graag te laden, voorkomt de API later onverwachte synchrone leesbewerkingen. Het vermijden van synchrone leesbewerkingen is vooral belangrijk voor streams die mogelijk blokkeren totdat gegevens beschikbaar zijn (zoals netwerkstreams). Dit is afgestemd op het goedgekeurde API-ontwerp en biedt een meer voorspelbare programmeerervaring.

Zie dotnet/runtime#121938, dotnet/runtime#121624 en de api-ontwerpdiscussie voor meer informatie.

Als uw code gebruikmaakt van ZipArchive.CreateAsync, moet u ervoor zorgen dat u uitzonderingen van de InvalidDataException methode-aanroep afhandelt bij het gebruik van CreateAsync. Deze uitzondering kan al worden gegenereerd in eerdere .NET-versies (bijvoorbeeld wanneer de ZIP Central-map niet kan worden gevonden), maar nu wordt deze ook gegenereerd voor ongeldige vermeldingen die eerder alleen werden gedetecteerd bij het openen van de Entries eigenschap.

Betreffende API's