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

ConcurrentDictionary始终为空,RemoveSession从未执行问题求助

问题排查方案

针对你遇到的ConcurrentDictionary始终取不到数据、RemoveSession从未执行的问题,从以下核心方向排查:

1. EndPoint实例的相等性不匹配

ConcurrentDictionary依赖键的GetHashCode()和Equals()方法判断键是否相同。如果添加会话时的remoteEndPoint和查找时的remoteEndPoint不是同一个实例,哪怕IP、端口完全一致,也会被判定为不同的键,导致查找失败。

比如添加时用的是Socket刚建立连接时的RemoteEndPoint实例,删除时用的是其他渠道获取的、属性相同但实例不同的EndPoint,就会出现这种情况。

验证方式:在AddSession和FindSessionByRemoteEndPoint中分别打印remoteEndPoint.GetHashCode(),对比两次的哈希值是否一致。

2. AddSession方法未被执行

虽然没有看到添加失败的Critical日志,但有可能AddSession本身就没被调用到——比如异步流程中调用时机滞后、分支逻辑跳过了该方法,或者代码路径根本没走到这里。

验证方式:在AddSession的Debug日志后追加明确的执行标记,比如:

this.logger.LogDebug($"AddSession executed for endpoint: {remoteEndPoint}");

检查日志中是否有这条输出,确认方法确实被触发。

3. ConcurrentDictionary实例被意外替换

如果endPointToSessionMap的引用被其他代码重新赋值(比如创建了新的ConcurrentDictionary实例并覆盖原变量),之前添加的会话数据会全部丢失,自然查不到任何内容。

验证方式:检查所有涉及endPointToSessionMap的代码,确认没有对该变量进行重新赋值的操作。

4. EndPoint内部属性被修改

部分EndPoint实现(如IPEndPoint)的哈希值依赖内部的IP和端口属性。如果在添加会话后,该remoteEndPoint的属性被意外修改,会导致后续查找时哈希值不匹配,无法找到对应的键。

验证方式:在添加和查找时分别打印remoteEndPoint的完整属性(如IP、端口),确认两次的属性完全一致。


调试代码建议

在关键方法中添加详细日志,帮助定位问题:

// 修改AddSession
public void AddSession(EndPoint remoteEndPoint, IPlayerSession session)
{
    this.logger.LogDebug($"Adding player session to {nameof(WorldContext)} | Endpoint: {remoteEndPoint}, HashCode: {remoteEndPoint.GetHashCode()}");

    if (!this.endPointToSessionMap.TryAdd(remoteEndPoint, session))
    {
        this.logger.LogCritical($"Failed to add session to {nameof(WorldContext)} | Endpoint: {remoteEndPoint}");
    }
    else
    {
        this.logger.LogDebug($"Successfully added session | Endpoint: {remoteEndPoint}, Total sessions: {this.endPointToSessionMap.Count}");
    }
}

// 修改FindSessionByRemoteEndPoint
public IPlayerSession? FindSessionByRemoteEndPoint(EndPoint remoteEndPoint)
{
    this.logger.LogDebug($"Looking up session | Endpoint: {remoteEndPoint}, HashCode: {remoteEndPoint.GetHashCode()}, Total sessions: {this.endPointToSessionMap.Count}");
    
    if (!this.endPointToSessionMap.TryGetValue(remoteEndPoint, out var session))
    {
        this.logger.LogDebug($"No session found for endpoint: {remoteEndPoint}");
        return null;
    }

    return session;
}

通过这些日志,可以明确看到:

  • 会话是否真的被成功添加
  • 添加和查找时的Endpoint实例是否一致
  • 字典中的会话总数是否符合预期

内容的提问来源于stack exchange,提问作者SleepyTurtle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:39:58