.NET中是否有一些流"管道"类?

4
我为C#编写了一个FastCGI库,这是在async/await出现之前。现在我正在编写版本2的此库,并考虑性能。因此,我使用socket.ReceiveAsync来使用IOCP(注意:ReceiveAsyncawait/async无关,我想使用ReceiveAsync)。
然而,用户可以通过不指定Content-Length头来回答传入的请求。这会导致库需要收集所有输出流量,直到所有数据都可用或用户指定Content-Length。
我的旧版本库通过自编类LocalPipe实现了这一点。 LocalPipe只是一个Stream,在其中可以写入数据,然后从中读取数据。如果没有足够的数据可用,则read方法会阻塞。
LocalPipe阻塞时,调用线程也会阻塞,因此在等待新数据时不会释放。这导致了“一个连接/一个线程”的设计,至少在等待LocalPipe中的数据时是这样的。
我的问题是:是否已经有一个类(作为NuGet包或.NET框架本身中的一个类)实现了类似于我的LocalPipe类的东西,但是它将“阻塞”而不保持呼叫线程在使用中?
我并不寻找常规的Task-Pattern for await,除非它确实可以避免使用不必要的Thread/ Task和上下文切换。目前似乎唯一实现这个类“线程友好”的方法是在自己实现一个可等待模式的同时,大量使用ExecutionContext和/或SynchronizationContext。如果我可以避免这种情况那就太好了。

你尝试过使用相应的泛型类型BlockingCollection吗?或者,也许是MemoryStream - VMAtm
两者都不是我要找的。BlockingCollection是一个Collection,而MemoryStream不是async的,并且在到达流的末尾时不会阻塞。然而,我通过实现自己的管道来解决了这个“问题”。我保持这个问题开放,也许有人知道一个开放的库。编辑:在有人提到之前,我知道来自流的*异步方法。但是根据referencesource,MemoryStream通过直接调用(例如)Read来使这些async-calls阻塞。 - Matthias
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接