gpt4 book ai didi

c# - 来自 System.IO.Compression 和异步 I/O 的 ZipFile 和 ZipArchive 类

转载 作者:行者123 更新时间:2023-11-30 14:25:12 27 4
gpt4 key购买 nike

.NET 4.5 添加了新类来处理 zip 存档。现在你可以这样做:

using (ZipArchive archive = ZipFile.OpenRead(zipFilePath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
// Extract it to the file
entry.ExtractToFile(entry.Name);

// or do whatever you want
using (Stream stream = entry.Open())
{
...
}
}
}

显然,如果您处理大型文件,则可能需要几秒钟甚至几分钟才能从文件中读取文件。因此,如果您正在编写一些 GUI 应用程序(WinForms 或 WPF),您可能会在单独的线程中运行此类代码,否则您将阻塞 UI 线程并使您的应用程序用户非常不高兴。

然而,此代码中的所有 I/O 操作都将在 blocking mode 中执行这在 2016 年被认为是“不酷”。所以有两个问题:

  1. 是否可以使用 System.IO.Compression 类(或者可能使用其他一些第三方 .NET 库)获得异步 I/O?
  2. 这样做有意义吗?我的意思是压缩/提取算法无论如何都非常消耗 CPU,所以如果我们甚至从 CPU-bound 阻塞 I/O 切换到异步 I/O,性能增益可能相对较小(当然在百分比,而不是绝对值)。

更新:

回复 Peter Duniho 的回答:是的,你是对的。出于某种原因,我没有考虑过这个选项:

using (Stream zipStream = entry.Open())
using (FileStream fileStream = new FileStream(...))
{
await zipStream.CopyToAsync(fileStream);
}

这绝对有效。谢谢!

顺便说一下

await Task.Run(() => entry.ExtractToFile(entry.Name));

仍然是CPU-bound阻塞式I/O操作,只是在单独的线程中在I/O操作期间从线程池中消耗线程。

然而,正如我所看到的,.NET 的开发人员仍然使用阻塞 I/O 进行某些存档操作(例如这段代码用于枚举存档中的条目:ZipArchive.cs on dotnet@github)。我还发现了一个关于 lack of asynchronous API for ZipFile APIs 的未决问题.

我想此时我们有部分异步支持,但还远未完成。

最佳答案

  1. Is it possible to get async I/O with System.IO.Compression classes (or maybe with some other third-party .NET library)?

根据“异步 I/O”的实际含义,您可以使用内置的 .NET 类型来实现。例如:

using (ZipArchive archive = await Task.Run(() => ZipFile.OpenRead(zipFilePath)))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
// Extract it to the file
await Task.Run(() => entry.ExtractToFile(entry.Name));

// or do whatever you want
using (Stream stream = entry.Open())
{
// use XXXAsync() methods on Stream object
...
}
}
}

如果您愿意,可以将它们包装在 XXXAsync() 扩展方法中。

  1. Does it even make sense to do that? I mean compressing/extracting algorithms are very CPU-consuming anyway, so if we even switch from CPU-bound I/O to async I/O, the performance gain can be relatively small (of course in percentage, not absolute values).

至少三个理由:

  1. CPU 非常快。在许多情况下,I/O 仍然是瓶颈,因此异步等待 I/O 很有用。
  2. 多核 CPU 是常态。因此,让一个核心负责减压而另一个核心负责其他工作很有用。
  3. 异步操作并不完全与性能有关,在某些情况下根本不与性能有关。异步处理您的文件允许用户界面保持响应,这很有用。

关于c# - 来自 System.IO.Compression 和异步 I/O 的 ZipFile 和 ZipArchive 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com