Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
ZipArchive.CreateAsync teraz chętnie ładuje wszystkie wpisy archiwum ZIP podczas wywołania metody. Ta zmiana gwarantuje, że uzyskiwanie dostępu do właściwości ZipArchive.Entries nie wykonuje synchronicznych odczytów w strumieniu bazowym, co jest zgodne z asynchronicznymi wzorcami programowania.
Wersja wprowadzona
.NET 11 (wersja zapoznawcza 1)
Poprzednie zachowanie
Wcześniej, gdy tworzyłeś ZipArchive poprzez użycie CreateAsync, uzyskiwanie dostępu do właściwości Entries mogło skutkować wykonaniem synchronicznych (blokujących) operacji odczytu na strumieniu bazowym. To zachowanie było niezgodne z asynchronicznym charakterem CreateAsync metody i może powodować problemy ze strumieniami, które nie obsługują operacji odczytu synchronicznego.
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;
Nowe zachowanie
Począwszy od platformy .NET 11, asynchronicznie odczytywany jest centralny katalog archiwum ZIP w ramach wywołania metody ZipArchive.CreateAsync. Wszelkie wyjątki związane z źle sformułowanymi wpisami lub problemami podczas odczytywania katalogu centralnego są teraz zgłaszane podczas wywołania CreateAsync. Dalszy dostęp do właściwości Entries nie wykonuje żadnych operacji odczytu na strumieniu bazowym.
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 zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Ta zmiana została wprowadzona w celu zwiększenia spójności i niezawodności podczas pracy ze strumieniami asynchronicznymi. Dzięki aktywnemu ładowaniu wpisów podczas wywołania CreateAsync, API unika późniejszych nieoczekiwanych synchronicznych operacji odczytu. Unikanie synchronicznych odczytów jest szczególnie ważne w przypadku strumieni, które mogą blokować do momentu udostępnienia danych (takich jak strumienie sieciowe). Jest to zgodne z zatwierdzonym projektem interfejsu API i zapewnia bardziej przewidywalne środowisko programowania.
Aby uzyskać więcej informacji, zobacz dotnet/runtime#121938, dotnet/runtime#121624 i omówienie projektowania interfejsu API.
Zalecana akcja
Jeśli twój kod używa ZipArchive.CreateAsync, upewnij się, że obsługujesz wyjątki InvalidDataException z wywołania metody CreateAsync. Ten wyjątek można już zgłosić w poprzednich wersjach platformy .NET (na przykład gdy nie można odnaleźć katalogu centralnego ZIP), ale teraz jest on również zgłaszany dla nieprawidłowo sformułowanych wpisów, które zostały wcześniej odnalezione tylko podczas uzyskiwania Entries dostępu do właściwości.