是否可以异步枚举文件字节块?

时间:2017-11-08 15:28:39

标签: c# .net file asynchronous async-await

我想做的就像

    /// <summary>
    /// Read zip file into chunks of bytes of largest size possible
    /// </summary>
    /// <param name="stream"></param>
    /// <returns>Enumeration of byte arrays</returns>
    private static async Task<IEnumerable<byte[]>> ChunkStreamBytes(FileStream stream)
    {
        var tasks = new List<Task<byte[]>>();
        for (long bytesRemaining = stream.Length; bytesRemaining > 0;)
        {
            int chunkSize = (int)Math.Min(bytesRemaining, int.MaxValue);
            byte[] chunk = new byte[chunkSize];
            bytesRemaining -= await stream.ReadAsync(chunk, 0, chunk.Length);
            yield return chunk;
        }
    }

但我收到了错误

  

......的主体不能成为迭代器块,因为   任务&GT;不是迭代器接口类型

我想过尝试await Task.WaitAll(...)每个任务正在读取一个块,但我不确定这些任务是否可能无序运行并搞砸了我试图构建的文件。由于上下文,我需要使用async - await模式。关于正确解决方案的任何想法?

1 个答案:

答案 0 :(得分:2)

IEnumerable<T> / IEnumerator<T> API(包括duck-typed等价物)本质上是同步的;你不能轻而易举地async,因为它基本上解包为bool MoveNext()T Current {get;}对 - 两者都不是async。关于async可枚举模式的讨论很快,但是:不是今天。