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;
破壞性變更的類型
此變更為行為變更。
變更的原因
此變更旨在提升非同步串流的一致性與可靠性。 API 在 CreateAsync 呼叫時積極載入條目,以避免將來發生意外的同步讀取操作。 避免同步讀取對於可能在資料可用前阻塞的串流(如網路串流)尤其重要。 這符合核准的 API 設計,並提供更可預測的程式設計體驗。
欲了解更多資訊,請參閱 dotnet/runtime#121938、 dotnet/runtime#121624 以及 API 設計討論。
建議的動作
如果你的程式碼使用 ZipArchive.CreateAsync,請確保你處理 InvalidDataException 方法呼叫中的 CreateAsync 例外。 這個例外在先前的 .NET 版本中已經可以拋出(例如找不到 ZIP 中央目錄時),但現在也會針對之前只有在存取 Entries 該屬性時才發現的格式錯誤條目也會拋出。