委托与CancellationToken排障:System.NullReferenceException异常求助
解决System.NullReferenceException异常的思路
虽然你确认了cts.Token和method不为null,但NullReferenceException的实际触发点是在你传入的ConnectAsyncDelegate委托内部,Commit方法里的return await method(cts.Token);只是调用委托的入口,异常是从委托执行的逻辑中抛出的。
你需要重点检查以下几个可能为null的对象:
tunnel实例是否未初始化,处于null状态tunnel.sslStreamServer属性是否为nullbuffer数组是否未分配内存(仅声明未初始化)
定位问题的验证代码
可以在委托内部添加空值检查,直接定位到具体的null对象:
Func<CancellationToken, Task<int?>> ConnectAsyncDelegate = async cts => { if (tunnel == null) throw new InvalidOperationException("tunnel 未初始化"); if (tunnel.sslStreamServer == null) throw new InvalidOperationException("sslStreamServer 为null"); if (buffer == null) throw new InvalidOperationException("buffer 未分配内存"); return await tunnel.sslStreamServer.ReadAsync(buffer, cts); };
额外注意点
如果sslStreamServer是SslStream类型,它的标准ReadAsync重载需要传入buffer、offset、count和CancellationToken四个参数。你当前只传了buffer和cts,可能是误用了重载(比如编译器匹配到了非预期的重载),这种情况也可能间接引发异常。建议明确传递参数:
return await tunnel.sslStreamServer.ReadAsync(buffer, 0, buffer.Length, cts);
内容的提问来源于stack exchange,提问作者Alexey Alferov
相关产品推荐
相关产品推荐

