gpt4 book ai didi

c# - 当async block并发数大于1时,抛出异常怎么办?

转载 作者:行者123 更新时间:2023-11-30 12:42:02 24 4
gpt4 key购买 nike

我有一个带有 TransformBlock 的 DataFlow,它同时运行异步磁盘读取方法。例如,从磁盘阵列读取多个文件,以非单个读取请求队列深度提供性能优势。

直觉上,当最后一个 ActionBlock 完成时,所有管道工作都应该完成。但是,会发生以下情况:

假设 Rabbit 和 Bear 开始将两个文件提取到它们自己的字节缓冲区中。 Rabbit 抛出 EatenByAWolf 异常。 Bear 稍后完成,因为它的文件有点大。当 Bear 从漫长的冬季休眠中醒来时,EatenByAWolf 异常似乎已经传播到最后一个 ActionBlock 的完成等待站点。好吧,问题是我在这里清理了 Rabbit 和 Bear 的字节缓冲区,导致 Bear 在 NullRefToBuffer 异常时阻塞。

推荐的方法是什么?在清除缓冲区之前,我还应该等待 Reader block (包含所有动物)完成,还是可以更优雅地处理?

Task.WaitAll(new[] { readerBlock.Completion, lastActionBlock.Completion });

对比

lastActionBlock.Completion.Wait();

最佳答案

我在错误的抽象级别管理字节缓冲区。

我的解决方案是在创建执行多个异步读取的 TransformBlock 时使用有状态读取器对象。添加ConcurrentBag<>缓冲区到 MyFileReaderWithCachingByteBuffers reader 对象确保在闭包捕获的 reader 对象超出范围之前不会清理缓冲区。只有当所有读取操作完成时才会发生这种情况。

var fileReader = new MyFileReaderWithCachingByteBuffers(biggestFileSize);
var readerBlock = new TransformBlock<string, MyObject>(
animal => fileReader.ReadAsync(animal),
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = customDOP });

关于c# - 当async block并发数大于1时,抛出异常怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35159901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com