在.NET中是否有一些流“管道”类?

时间:2017-10-06 03:35:24

标签: c# .net stream async-await pipe

我为F#编写了一个FastCGI库。这是在async / await之前。现在我正在编写这个库的第2版,并考虑到性能。因此我使用socket.ReceiveAsync来使用IOCP。 (注意:ReceiveAsyncawait / async无关。我想使用ReceiveAsync。)

但是,库的用户可以通过不指定Content-Length-header来应答传入的请求。这导致库需要收集所有传出流量,直到所有数据都可用或用户指定Content-Length。

我的旧版本库通过自编的课程LocalPipe实现了这一点。 LocalPipe只是一个Stream,您可以在其中写入数据,然后从中读取数据。如果没有足够的可用数据,则读取方法会阻塞。

LocalPipe阻塞时,调用线程也会阻塞,因此在等待新数据时不会释放。这导致了“一个连接/一个线程”设计,至少在等待来自LocalPipe的数据时。

我的问题是:是否已经有一个类(如NuGet包或在.NET框架本身中)实现类似于我的LocalPipe类但会在没有保持调用线程的情况下“阻塞”使用吗

搜索Task的常规await - 模式,除非它真的会避免使用不必要的Thread s / {{ 1}}和上下文切换。目前,实现这个类“线程消费友好”的唯一方法似乎是在我自己实现一个等待模式时大量使用Task和/或ExecutionContext。如果我可以逃避这一点,那就太好了。

1 个答案:

答案 0 :(得分:0)

是的,同时有:

System.IO.Pipelines