PipeReader CancelPendingRead不会取消当前的读取操作

时间:2020-09-28 08:54:25

标签: c# .net system.io.pipelines

如果我用CancelPendingRead取消了当前的读取操作,我希望能够开始另一个读取操作。但是这段代码抛出了InvalidOperationExceptionCancelPendingRead是否无法按照我的想法工作,或者可能是问题所在? 我正在使用.Net Core 3.1进行测试。

try
{
    var p = new Pipe();
    await p.Writer.WriteAsync( new Byte[] { 1, 2, 3 } );

    var rr = await p.Reader.ReadAsync();
    p.Reader.CancelPendingRead();

    rr = await p.Reader.ReadAsync(); // Reading is already in progress.
}
catch ( InvalidOperationException ex )
{
    Console.WriteLine( ex );
}

1 个答案:

答案 0 :(得分:0)

好,我发现了问题: CancelPendingRead确实取消了等待读取。它不会不“取消”已执行的读取。解决方案是将读取器推进到刚读取缓冲区的开头。

var p = new Pipe();
var readTask = p.Reader.ReadAsync();

p.Reader.CancelPendingRead();

var rr = await readTask;
// rr.IsCanceled; => is true
p.Reader.AdvanceTo( rr.Buffer.Start );
rr = await p.Reader.ReadAsync();
相关问题