diff --git a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs index 36912f9e..31b4596a 100644 --- a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs @@ -71,12 +71,16 @@ public static partial class IArchiveEntryExtensions throw new ExtractionException("Entry is a file directory and cannot be extracted."); } +#if SYNC_ONLY + using var entryStream = archiveEntry.OpenEntryStream(); +#else var entryStream = await archiveEntry .OpenEntryStreamAsync(cancellationToken) .ConfigureAwait(false); await using var entryStreamScope = entryStream .DisposeAsyncScope() .ConfigureAwait(false); +#endif var checkedStream = options is null ? entryStream : IEntryExtensions.WrapWithChecksumValidation(archiveEntry, entryStream, options); diff --git a/src/SharpCompress/Common/EntryStream.cs b/src/SharpCompress/Common/EntryStream.cs index d2e3f51c..bf835b93 100644 --- a/src/SharpCompress/Common/EntryStream.cs +++ b/src/SharpCompress/Common/EntryStream.cs @@ -30,18 +30,7 @@ public partial class EntryStream : AsyncDisposableStream _isDisposed = true; if (!(_completed || _reader.Cancelled)) { - if (Utility.UseSyncOverAsyncDispose()) - { -#pragma warning disable VSTHRD002 // Avoid problematic synchronous waits -#pragma warning disable CA2012 - SkipEntryAsync().GetAwaiter().GetResult(); -#pragma warning restore CA2012 -#pragma warning restore VSTHRD002 // Avoid problematic synchronous waits - } - else - { - SkipEntry(); - } + SkipEntry(); } //Need a safe standard approach to this - it's okay for compression to overreads. Handling needs to be standardised diff --git a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs index 86594f63..c4dc0b72 100644 --- a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs +++ b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs @@ -29,18 +29,7 @@ internal class TarReadOnlySubStream : Stream _isDisposed = true; if (disposing) { - if (Utility.UseSyncOverAsyncDispose()) - { -#pragma warning disable VSTHRD002 // Avoid problematic synchronous waits -#pragma warning disable CA2012 - AdvanceToNextHeaderAsync().GetAwaiter().GetResult(); -#pragma warning restore CA2012 -#pragma warning restore VSTHRD002 // Avoid problematic synchronous waits - } - else - { - AdvanceToNextHeader(); - } + AdvanceToNextHeader(); } base.Dispose(disposing); } diff --git a/src/SharpCompress/Common/Zip/WinzipAesCryptoStream.cs b/src/SharpCompress/Common/Zip/WinzipAesCryptoStream.cs index f6343c02..8a4eda18 100644 --- a/src/SharpCompress/Common/Zip/WinzipAesCryptoStream.cs +++ b/src/SharpCompress/Common/Zip/WinzipAesCryptoStream.cs @@ -69,28 +69,27 @@ internal partial class WinzipAesCryptoStream : Stream _isDisposed = true; if (disposing) { - // Read out last 10 auth bytes - catch exceptions for async-only streams - if (Utility.UseSyncOverAsyncDispose()) + // Read out last 10 auth bytes +#if LEGACY_DOTNET + // Stream has no DisposeAsync on legacy targets, so async flows fall back to this + // sync Dispose while the underlying stream may be async-only. + var ten = ArrayPool.Shared.Rent(10); + try { - var ten = ArrayPool.Shared.Rent(10); - try - { #pragma warning disable VSTHRD002 // Avoid problematic synchronous waits #pragma warning disable CA2012 - _stream.ReadFullyAsync(ten, 0, 10).GetAwaiter().GetResult(); + _stream.ReadFullyAsync(ten, 0, 10).GetAwaiter().GetResult(); #pragma warning restore CA2012 #pragma warning restore VSTHRD002 // Avoid problematic synchronous waits - } - finally - { - ArrayPool.Shared.Return(ten); - } } - else + finally { - Span ten = stackalloc byte[10]; - _stream.ReadFully(ten); + ArrayPool.Shared.Return(ten); } +#else + Span ten = stackalloc byte[10]; + _stream.ReadFully(ten); +#endif _stream.Dispose(); } base.Dispose(disposing); diff --git a/src/SharpCompress/Utility.cs b/src/SharpCompress/Utility.cs index c03c3643..c5824d51 100644 --- a/src/SharpCompress/Utility.cs +++ b/src/SharpCompress/Utility.cs @@ -23,15 +23,6 @@ internal static partial class Utility ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; - public static bool UseSyncOverAsyncDispose() - { - var useSyncOverAsync = false; -#if LEGACY_DOTNET - useSyncOverAsync = true; -#endif - return useSyncOverAsync; - } - private static readonly HashSet invalidChars = new(Path.GetInvalidFileNameChars()); public static ReadOnlyCollection ToReadOnly(this IList items) => new(items);