我为C#编写了FastCGI库。这是在异步/等待时间之前。现在,我正在考虑性能的情况下对该库的版本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 / Task
s和上下文切换的使用。当前,实现此类“线程消耗友好”类的唯一方法似乎是在我自己实现等待模式的同时大量使用ExecutionContext
和/或SynchronizationContext
。如果我能回避这个问题,那就太好了。
最佳答案
是的,同时有:
System.IO.Pipelines