ZipArchive.CreateAsync 이제 메서드 호출 중에 모든 ZIP 보관 항목을 즉시 로드합니다. 이렇게 변경하면 속성에 ZipArchive.Entries 액세스해도 비동기 프로그래밍 패턴과 일치하는 기본 스트림에서 동기 읽기가 수행되지 않습니다.
도입된 버전
.NET 11 미리 보기 1
이전 동작
이전에 CreateAsync를 사용하여 ZipArchive를 만들 때, 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를 사용하는 경우, CreateAsync 메서드 호출에서 발생하는 InvalidDataException 예외를 처리해야 합니다. 이 예외는 이전 .NET 버전(예: ZIP 중앙 디렉터리를 찾을 수 없는 경우)에서 이미 throw될 수 있지만, 이제는 이전에 속성에 액세스할 Entries 때만 검색된 잘못된 형식의 항목에 대해서도 throw됩니다.
영향을 받는 API
.NET