我为C#编写了一个FastCGI库,这是在async/await出现之前。现在我正在编写版本2的此库,并考虑性能。因此,我使用socket.ReceiveAsync来使用IOCP(注意:
然而,用户可以通过不指定Content-Length头来回答传入的请求。这会导致库需要收集所有输出流量,直到所有数据都可用或用户指定Content-Length。
我的旧版本库通过自编类
当
我的问题是:是否已经有一个类(作为NuGet包或.NET框架本身中的一个类)实现了类似于我的
我并不寻找常规的
ReceiveAsync
与await
/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
? - VMAtmBlockingCollection
是一个Collection
,而MemoryStream
不是async
的,并且在到达流的末尾时不会阻塞。然而,我通过实现自己的管道来解决了这个“问题”。我保持这个问题开放,也许有人知道一个开放的库。编辑:在有人提到之前,我知道来自流的*异步方法。但是根据referencesource,MemoryStream
通过直接调用(例如)Read
来使这些async
-calls阻塞。 - Matthias