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