我需要将 ZipArchive 条目处理为字符串。目前我有这样的代码:
using (ZipArchive archive = ZipFile.OpenRead(zipFileName))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
using (StreamReader sr = new StreamReader(entry.Open()))
{
string s = sr.ReadToEnd();
// doing something with s
}
}
}
如果使用 Parallel.ForEach 或类似循环在多个 CPU 核心上并行完成,处理速度可能会快得多。问题是
ZipArchive
不是线程安全的。
也许,我们可以使用 Partitioner 类从 ZipArchive.Entries 获取范围,将它们输入到
Parallel.ForEach
循环中,然后再次打开 zip 存档,循环体中的每个条目都使用 ZipArchive
的新实例
线程安全,但我不知道该怎么做。可以吗?
如果没有,如果我们只需要读取它们,是否有另一种可靠的方法来并行处理 zip 存档条目?
只需让每个线程创建自己的
ZipArchive
和 ZipArchiveEntry
对象即可。遍历中央目录只需要很少的时间,因此为每个线程指定一个自己的编号 n 来处理哪个条目,然后给定的线程将遍历条目 n 次以到达其条目。多个 ZipArchive
对象读取同一个 zip 文件应该没有问题。