2

目前我正在使用以下实用程序扩展来读取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读取超时?

4

1 回答 1

3

我们可以使用 aCancellationToken以更有效的方式实现超时:

using var cancellation = new CancellationTokenSource(timout);

try
{
    Data = (await Reader.ReadAsync(cancellation.Token)).Buffer;
}
catch (OperationCanceledException)
{
    return null;
}
于 2020-03-09T12:07:46.073 回答