Код: Выделить всё
private static async Task ExtractFilesAsync(this ZipArchive archive, string destination, IProgress progress = null)
{
await Task.Run(() =>
{
long bytesWritten = 0;
long totalBytes = archive.GetUncompressedSize();
int percent = 0;
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!entry.IsDirectory())
{
string fullPath = Path.Combine(destination, entry.FullName);
using (FileStream writeStream = File.OpenWrite(fullPath))
{
using (Stream readStream = entry.Open())
{
int chunkSize = 1024;
byte[] buffer = new byte[chunkSize];
while (true)
{
int bytesRead = readStream.Read(buffer, 0, chunkSize);
if (bytesRead == 0)
{
break;
}
writeStream.Write(buffer, 0, bytesRead);
bytesWritten += bytesRead;
int newPercent = (int)(bytesWritten / (double)totalBytes * 100.0);
if (newPercent > percent)
{
percent = newPercent;
progress?.Report(percent);
Trace.WriteLine($"{percent}");
}
}
}
}
}
}
});
}
Код: Выделить всё
private static async Task ExtractFilesAsync(this ZipArchive archive, string destination, IProgress progress = null)
{
long bytesWritten = 0;
long totalBytes = archive.GetUncompressedSize();
int percent = 0;
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (!entry.IsDirectory())
{
string fullPath = Path.Combine(destination, entry.FullName);
using (FileStream writeStream = File.OpenWrite(fullPath))
{
using (Stream readStream = entry.Open())
{
int chunkSize = 1024;
byte[] buffer = new byte[chunkSize];
while (true)
{
int bytesRead = await readStream.ReadAsync(buffer, 0, chunkSize);
if (bytesRead == 0)
{
break;
}
await writeStream.WriteAsync(buffer, 0, bytesRead);
bytesWritten += bytesRead;
int newPercent = (int)(bytesWritten / (double)totalBytes * 100.0);
if (newPercent > percent)
{
percent = newPercent;
progress?.Report(percent);
Trace.WriteLine($"{percent}");
}
}
}
}
}
}
}
Изменить:
Увеличен размер chunkSize до 1 МБ.
Похоже, что Stream.ReadAsync читает только около 15 КБ за каждое чтение, в то время как Stream.Read считывает весь МБ. Следовательно, Stream.ReadAsync является узким местом. Но почему?
Подробнее здесь: https://stackoverflow.com/questions/793 ... iparchivee