我正在使用异步I/O与HID设备通信,当超时时,我想抛出一个可捕获的异常。我有以下读取方法:
public async Task<int> Read( byte[] buffer, int? size=null )
{
size = size ?? buffer.Length;
using( var cts = new CancellationTokenSource() )
{
cts.CancelAfter( 1000 );
cts.Token.Register( () => { throw new TimeoutException( "read timeout" ); }, true );
try
{
var t = stream.ReadAsync( buffer, 0, size.Value, cts.Token );
await t;
return t.Result;
}
catch( Exception ex )
{
Debug.WriteLine( "exception" );
return 0;
}
}
}
Token的回调函数抛出的异常没有被任何try/catch块捕获,我不确定为什么。我认为它会在await处抛出,但事实并非如此。有没有一种方法可以捕获这个异常(或使它能够被Read()的调用者捕获)?
编辑:因此,我重新阅读了msdn上的文档,它说“委托生成的任何异常都将传播到此方法调用之外”。
我不确定它所说的“传播到此方法调用之外”是什么意思,因为即使我将.Register()调用移动到try块中,异常仍然无法被捕获。
Task.Delay(Timeout.Infinite, token)
。 - noseratio - open to work