我有我使用异步编程模型(APM)成语(例如,BeginRead / EndRead)在C#写了一些高性能文件传输的代码。此代码读取从本地磁盘上的文件,并将其写入到套接字。

有关现代化的硬件最佳性能,它保留不止一个未完成的I / O操作在飞行中只要有可能是很重要的。因此,我在文件发布几个BeginRead操作,那么当一个人完成,我呼吁在插座上BeginSend,并且当完成我在文件中的另一个BeginRead。细节比,但在高水平的想法有点复杂。

我已经得到了基于APM代码的工作,但它是非常难以遵循,可能有细微的并发错误。我喜欢使用TPL此相反。我想Task.Factory.FromAsync就只是这样做,但有一个问题。

我见过的I / O样品的所有(最特别是在并行扩展附加的StreamExtensions类)假设一个读接着是一个写操作。这将不执行方法我需要。

我不能使用一些简单的像Parallel.ForEach或其它功能扩展Task.Factory.Iterate因为异步I / O任务不会花很多时间在一个工作线程,因此并行刚刚启动另一个任务,从而可能导致数十或数百的挂起的I / O操作;太多!您可以解决由Waiting你的任务,但可引发事件句柄(内核对象)的创建,并在任务等待句柄阻塞等待,这关系一个工作线程。我基于APM-实现避免了这两点。

我一直在玩弄不同的方法来保持多个读/写操作在飞行中,我已经成功地做到这一点使用调用创建另一个任务的方法延续,但感觉别扭,绝对没有按”吨感觉像惯用TPL。

有没有其他人,像这样与TPL的问题拼杀?任何建议?

有帮助吗?

解决方案

如果你担心太多线程,只需将ParallelOptions.MaxDegreeOfParallelism到您的来电Parallel.ForEach可接受的数量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top