You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

委托与CancellationToken排障:System.NullReferenceException异常求助

解决System.NullReferenceException异常的思路

虽然你确认了cts.Token和method不为null,但NullReferenceException的实际触发点是在你传入的ConnectAsyncDelegate委托内部,Commit方法里的return await method(cts.Token);只是调用委托的入口,异常是从委托执行的逻辑中抛出的。

你需要重点检查以下几个可能为null的对象:

  • tunnel实例是否未初始化,处于null状态
  • tunnel.sslStreamServer属性是否为null
  • buffer数组是否未分配内存(仅声明未初始化)

定位问题的验证代码

可以在委托内部添加空值检查,直接定位到具体的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:03:26