PipeReader CancelPendingRead 不取消当前读取操作
PipeReader CancelPendingRead not cancelling current read operation
如果我用 CancelPendingRead
取消当前读取,我希望能够开始另一个读取操作。但是这段代码抛出 InvalidOperationException
。 CancelPendingRead
是否没有像我想的那样工作或者可能是什么问题?
我正在使用 .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 );
}
好的,我发现了问题:
CancelPendingRead
确实取消了等待读取。它确实 NOT 而不是“取消”已经执行的读取。解决方案是将 reader 推进到刚刚读取缓冲区的开头。
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();
如果我用 CancelPendingRead
取消当前读取,我希望能够开始另一个读取操作。但是这段代码抛出 InvalidOperationException
。 CancelPendingRead
是否没有像我想的那样工作或者可能是什么问题?
我正在使用 .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 );
}
好的,我发现了问题:
CancelPendingRead
确实取消了等待读取。它确实 NOT 而不是“取消”已经执行的读取。解决方案是将 reader 推进到刚刚读取缓冲区的开头。
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();