我正在使用异步 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;
}
}
}
令牌回调抛出的异常没有被任何 try/catch 块捕获,我不知道为什么。我以为它会在等待时被抛出,但事实并非如此。有没有办法捕捉这个异常(或者让它可以被 Read() 的调用者捕捉到)?
编辑: 所以我重新阅读了msdn的文档上的文档,它说“委托生成的任何异常都将传播出这个方法调用。”
我不确定“从这个方法调用中传播”是什么意思,因为即使我将 .Register() 调用移到 try 块中,仍然没有捕获到异常。