我想用 C# 处理 zip 存档。在
entry.Open()
之后,我需要使用一些异步方法。在下面的示例中,我使用 await Task.Delay(1);
。我可以处理第一个条目。但是当我处理第二个条目时,我得到一个 ObjectDisposedException
。
using (var fs = File.OpenRead(path))
using (var zipArchive = new ZipArchive(fs, ZipArchiveMode.Read, true))
{
foreach (var entry in zipArchive.Entries)
{
// The second entry in the foreach loop throws an Exception:
// System.ObjectDisposedException: 'Cannot access a disposed object.
// Object name: 'System.String'.'
using (var s = entry.Open())
{
// How can I process entry with async/await?
await Task.Delay(1);
}
}
}
在读取 ZipArchive 的条目时如何使用 async/await?
为了异步处理一些条目,第一步我将创建一个返回任务的异步方法。例如:
private async Task DoWhateverYouWant(byte[] data)
{
// You process entry asynchronously here
}
然后,如果你想异步读取条目,你可以在
ReadAsync
对象(即 Stream 对象)上调用 entry
,并利用 async 函数进行进一步处理,例如:
var zipTasks= new List<Task>(); //define a task list.
foreach (var entry in zipArchive.Entries)
{
using (var stream = entry.Open())
{
var buffer = new byte[entry.Length-1];
await stream.ReadAsync(buffer, 0, buffer.Length); // read asynchronously from stream
zipTasks.Add(DoWhateverYouWant(buffer)); //add a async task to our list
}
}
await zipTasks.WhenAll(tasks); // wait for all tasks to finish