目前我正在使用以下实用程序扩展来读取PipeReader
具有指定超时的 a。超时需要Keep-Alive
在 HTTP 服务器中正确实现。
internal static async Task<ReadResult?> ReadWithTimeoutAsync(this PipeReader reader, TimeSpan timeout)
{
ReadResult? result = null;
var readTask = Task.Run(async () =>
{
result = await reader.ReadAsync();
});
var success = await Task.WhenAny(readTask, Task.Delay(timeout)) == readTask;
if (!success || (result == null))
{
return null;
}
return result;
}
这段代码在几个方面存在问题,因为它引入了锁定(内部Task.Delay
)、大量分配和一个要由 CPU 处理的线程。
有没有更有效的方法来使用PipeReader
读取超时?