ZipArchive.CreateAsync メソッド呼び出し中にすべての ZIP アーカイブ エントリを熱心に読み込むようになりました。 この変更により、 ZipArchive.Entries プロパティにアクセスしても、基になるストリームに対して同期読み取りが実行されないようにします。これは、非同期プログラミング パターンに合わせて調整されます。
導入されたバージョン
.NET 11 Preview 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 プロパティにアクセスしたときにのみ発見されていた不正なエントリに対してもスローされるようになりました。
影響を受ける API
.NET