Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
ZipArchive.CreateAsync nyní dychtivě načte všechny položky archivu ZIP během volání metody. Tato změna zajišťuje, že přístup k ZipArchive.Entries vlastnosti neprovádí synchronní čtení v podkladovém datovém proudu, který odpovídá asynchronním programovacím vzorům.
Verze byla představena
.NET 11 Preview 1
Předchozí chování
Dříve, když jste vytvořili ZipArchive použitím CreateAsync, přístup k vlastnosti Entries mohl by vést k synchronním (blokujícím) operacím čtení prováděným v podkladovém datovém proudu. Toto chování bylo nekonzistentní s asynchronní povahou CreateAsync metody a mohlo by způsobit problémy se streamy, které nepodporují synchronní čtení.
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;
Nové chování
Počínaje rozhraním .NET 11 se centrální adresář archivu ZIP čte asynchronně jako součást ZipArchive.CreateAsync volání metody. Jakékoli výjimky související s poškozenými položkami nebo problémy při čtení centrálního adresáře jsou nyní vyvolány během volání CreateAsync. Následný přístup k vlastnosti Entries neprovádí žádné operace čtení v podkladovém datovém proudu.
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 zásadní změny
Tato změna je změna chování.
Důvod změny
Tato změna byla provedena kvůli zlepšení konzistence a spolehlivosti při práci s asynchronními datovými proudy. Díky dychtivému načítání položek během CreateAsync volání se rozhraní API vyhne neočekávaným synchronním operacím čtení později. Zabránění synchronním čtením je zvlášť důležité pro datové toky, které můžou skončit blokováním, dokud nebudou k dispozici data (například síťové toky). To odpovídá schválenému návrhu rozhraní API a poskytuje předvídatelnější programovací prostředí.
Další informace najdete v tématu dotnet/runtime#121938, dotnet/runtime#121624 a diskuzi o návrhu rozhraní API.
Doporučená akce
Pokud váš kód používá ZipArchive.CreateAsync, ujistěte se, že zpracováváte InvalidDataException výjimky z CreateAsync volání metody. Tato výjimka už může být vyvolána v předchozích verzích .NET (například když centrální adresář ZIP nelze najít), ale teď je vyvolána také u poškozených položek, které byly dříve zjištěny pouze při přístupu k Entries vlastnosti.