C# 有小溪吗;管道;在.NET中上课?

C# 有小溪吗;管道;在.NET中上课?,c#,.net,stream,async-await,pipe,C#,.net,Stream,Async Await,Pipe,我为C#编写了一个FastCGI库。这是在异步/等待时间之前。现在我正在编写这个库的第2版,并考虑性能。因此,我通过使用socket.ReceiveAsync来使用IOCP。(注意:ReceiveAsync与wait/async无关。我想使用ReceiveAsync) 但是,库的用户可以通过不指定内容长度头来回答传入的请求。这会导致库需要收集所有传出流量,直到所有数据可用或用户指定内容长度 这个库的旧版本是通过一个自编类LocalPipe实现的LocalPipe只是一个流,您可以在其中写入数据,

我为C#编写了一个FastCGI库。这是在异步/等待时间之前。现在我正在编写这个库的第2版,并考虑性能。因此,我通过使用socket.ReceiveAsync来使用IOCP。(注意:
ReceiveAsync
wait
/
async
无关。我想使用
ReceiveAsync

但是,库的用户可以通过不指定内容长度头来回答传入的请求。这会导致库需要收集所有传出流量,直到所有数据可用或用户指定内容长度

这个库的旧版本是通过一个自编类
LocalPipe
实现的
LocalPipe
只是一个流,您可以在其中写入数据,然后从中读取数据。如果没有足够的可用数据,读取方法将被阻塞

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

我的问题是:是否已经有一个类(作为NuGet包或.NET framework本身)实现了类似我的
LocalPipe
类的东西,但它将“阻止”调用线程而不保持使用状态?


我不是在搜索
等待
的常规
任务
-模式,除非它确实可以避免使用不必要的
线程
s/
任务
s和上下文切换。目前,实现此类“线程消费友好”的唯一方法似乎是大量使用
ExecutionContext
和/或
SynchronizationContext
,同时实现我自己期待的模式。如果我能避开这一点就好了。

是的,同时还有:


您是否尝试了带有相应泛型类型的
BlockingCollection
?或者,也许,
MemoryStream
?这两个都不是我想要的
BlockingCollection
是一个
集合
,而
MemoryStream
不是
async
并且在到达流结束时不会阻塞。然而,我通过实现自己的管道解决了这个“问题”。我保留这个问题,也许有人知道一个开放的图书馆。编辑:就在有人提到这一点之前:我知道*异步方法来自流。但是根据referencesource,内存流只通过直接调用(例如)内存中的读取来阻止这些异步调用。