Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ZipArchive.CreateAsync теперь очень активно загружает все записи ZIP-архива во время вызова метода. Это изменение гарантирует, что доступ к свойству ZipArchive.Entries не производит синхронные операции чтения в базовом потоке, что соответствует асинхронным шаблонам программирования.
Представленная версия
.NET 11( предварительная версия 1)
Предыдущее поведение
Ранее при создании ZipArchive с помощью CreateAsync доступ к свойству Entries может приводить к блокирующим (синхронным) операциям чтения на базовом потоке. Это поведение было несовместимо с асинхронной природой CreateAsync метода и может вызвать проблемы с потоками, которые не поддерживают синхронные операции чтения.
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;
Новое поведение
Начиная с .NET 11 центральный каталог ZIP-архива считывается асинхронно в рамках ZipArchive.CreateAsync вызова метода. Все исключения, связанные с неправильными записями или проблемами с чтением центрального каталога, теперь возникают при вызове CreateAsync. Последующий доступ к свойству Entries не выполняет никаких операций чтения в базовом потоке.
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;
Тип разрушающего изменения
Это изменение поведения.
Причина изменения
Это изменение было сделано для повышения согласованности и надежности при работе с асинхронными потоками. Заранее загружая записи во время CreateAsync вызова, API позволяет избежать непредвиденных синхронных операций чтения впоследствии. Избегайте синхронных операций чтения, особенно для потоков, которые могут блокироваться, пока данные не станут доступны (например, сетевые потоки). Это соответствует утвержденному проектированию API и обеспечивает более прогнозируемый интерфейс программирования.
Дополнительные сведения см. в статье dotnet/runtime#121938, dotnet/runtime#121624 и обсуждение конструктора API.
Рекомендуемое действие
Если используется ZipArchive.CreateAsyncкод, убедитесь, что вы обрабатываете InvalidDataException исключения из CreateAsync вызова метода. Это исключение уже может быть создано в предыдущих версиях .NET (например, когда не удается найти ZIP-центральный каталог), но теперь он также создается для неправильно сформированных записей, которые ранее были обнаружены только при доступе к свойству Entries .