Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
ZipArchive.CreateAsync läser nu ivrigt in alla ZIP-arkivposter under metodanropet. Den här ändringen säkerställer att åtkomst till ZipArchive.Entries egenskapen inte utför synkrona läsningar på den underliggande strömmen, vilket överensstämmer med asynkrona programmeringsmönster.
Version lanserad
.NET 11 Förhandsversion 1
Tidigare beteende
Tidigare när du skapade en ZipArchive med hjälp av CreateAsync, kunde åtkomst till Entries-egenskapen resultera i synkrona (blockerande) läsåtgärder som utförs på den underliggande strömmen. Det här beteendet var inkonsekvent med metodens CreateAsync asynkrona karaktär och kan orsaka problem med strömmar som inte stöder synkrona läsningar.
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;
Nytt beteende
Från och med .NET 11 läss den centrala katalogen i ZIP-arkivet asynkront som en del av metodanropet ZipArchive.CreateAsync . Undantag som rör felaktiga poster eller problem med att läsa den centrala katalogen utlöses nu under anropet CreateAsync . Efterföljande åtkomst till Entries egenskapen utför inga läsåtgärder på den underliggande dataströmmen.
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;
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändring
Den här ändringen gjordes för att förbättra konsekvensen och tillförlitligheten när man arbetar med asynkrona strömmar. Genom att ivrigt läsa in poster under anropet CreateAsync undviker API:et oväntade synkrona läsåtgärder senare. Att undvika synkrona läsningar är särskilt viktigt för strömmar som kan blockeras tills data är tillgängliga (till exempel nätverksströmmar). Detta överensstämmer med den godkända API-designen och ger en mer förutsägbar programmeringsupplevelse.
Mer information finns i dotnet/runtime#121938, dotnet/runtime#121624 och api-designdiskussionen.
Rekommenderad åtgärd
Om din kod använder ZipArchive.CreateAsync, se till att du hanterar InvalidDataException-undantag från CreateAsync-metodanropet. Det här undantaget kan redan genereras i tidigare .NET-versioner (till exempel när ZIP Central-katalogen inte kan hittas), men nu genereras det även för felaktiga poster som tidigare bara identifierades vid åtkomst till Entries egenskapen.