如何在读取 ZipArchive 条目时使用 async/await?

问题描述 投票:0回答:1

我想用 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?

c# async-await zip c#-ziparchive
1个回答
0
投票

为了异步处理一些条目,第一步我将创建一个返回任务的异步方法。例如:

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
© www.soinside.com 2019 - 2024. All rights reserved.