我想做的就像
/// <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
模式。关于正确解决方案的任何想法?
答案 0 :(得分:2)
IEnumerable<T>
/ IEnumerator<T>
API(包括duck-typed等价物)本质上是同步的;你不能轻而易举地async
,因为它基本上解包为bool MoveNext()
和T Current {get;}
对 - 两者都不是async
。关于async
可枚举模式的讨论很快,但是:不是今天。