c# – 在单个文件中有多个同时写入器(无读取器).是否有可能在.NET中以高效的方式完成?

我正在开发一个多段文件下载器.为了完成这个任务,我目前在磁盘上创建了与我所拥有的段一样多的临时文件(它们在文件下载期间被修复了数量).最后我只创建一个新文件f并将所有段的内容复制到f.

我想知道是否有更好的方法来实现这一目标.我的理想化是最初在其全尺寸中创建f,然后让不同的线程直接写入其部分.他们之间不需要任何形式的互动.我们可以假设它们中的任何一个都将从文件中的自己的起始点开始,然后只在文件中按顺序填充信息,直到其任务结束.

我听说过Memory-Mapped文件(http://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx),我想知道它们是否是我问题的解决方案.

谢谢

最佳答案
使用内存映射的API是绝对可行的,它可能会表现得相当好 – 因为建议进行一些测试.

如果您想寻找可能的替代实现,我有以下建议.

>创建一个静态堆栈数据结构,下载线程可以在下载后立即推送每个文件段.
>让一个单独的线程侦听堆栈上的推送通知.弹出堆栈文件段并以单线程方式将每个段保存到目标文件中.

通过遵循上述模式,您可以将文件段的下载和保存分成常规文件,方法是在其间放置一个堆栈容器.

根据堆栈处理的实现,您将能够通过非常少的线程锁定来实现此功能,从而最大限度地提高性能.

这样做的优点是,您可以100%控制正在发生的事情以及可能更便携的解决方案(如果这应该是一个问题).

您执行的堆栈解耦模式也可以实现非常通用,甚至可能在将来重用.

这种实现并不复杂,可能与围绕内存映射api所需的实现相提并论.

玩得开心…

/安德斯

转载注明原文:c# – 在单个文件中有多个同时写入器(无读取器).是否有可能在.NET中以高效的方式完成? - 代码日志