根据角色ID获取完整角色信息(异步)

public async Task<GameCharacter> GetCharacterAsync(string characterId)

  • public: 访问修饰符,表示该方法可以从其他类中访问。

  • async: 表示这是一个异步方法,内部可以使用await关键字。

  • Task<GameCharacter>: 返回一个任务,该任务在完成时会返回一个GameCharacter对象。

  • GetCharacterAsync: 方法名,表示异步获取角色。

  • (string characterId): 参数列表,需要一个字符串类型的角色ID。

复制代码
{
    if (string.IsNullOrEmpty(characterId))
    {
        Debug.LogWarning("尝试获取空ID的角色");
        return null;
    }
  • if (string.IsNullOrEmpty(characterId)): 检查角色ID是否为null或空字符串。

  • Debug.LogWarning: 打印警告日志。

  • return null;: 返回null,表示没有获取到角色。

复制代码
    // 性能监控
    _totalLoads++;
    LogPerformanceIfNeeded();
  • _totalLoads++;: 增加加载次数的计数器。

  • LogPerformanceIfNeeded();: 调用方法,根据需要记录性能日志(例如,每隔一段时间记录一次)。

csha

复制代码
    try
    {
        // 1. 首先检查缓存
        if (CharacterCache.TryGet(characterId, out var cachedCharacter))
        {
            if (EnableDetailedLogging)
            {
                Debug.Log($"角色缓存命中: {characterId}");
            }
            return cachedCharacter;
        }
  • try: 开始异常处理块。

  • CharacterCache.TryGet(characterId, out var cachedCharacter): 尝试从缓存中获取角色,如果找到则返回true并将角色对象赋值给cachedCharacter

  • 如果找到,则根据详细日志设置决定是否打印日志,然后返回缓存的角色。

复制代码
        if (EnableDetailedLogging)
        {
            Debug.Log($"角色缓存未命中,从数据库加载: {characterId}");
        }
  • 如果缓存未命中,则记录一条日志,表示将从数据库加载。
复制代码
        // 2. 从数据库加载
        var character = await Task.Run(() => LoadCharacterFromDatabase(characterId));
  • Task.Run(() => LoadCharacterFromDatabase(characterId)): 将同步方法LoadCharacterFromDatabase包装成一个在后台线程运行的任务,以避免阻塞主线程。

  • await: 等待任务完成,并获取返回的GameCharacter对象。

复制代码
        if (character != null)
        {
            // 3. 放入缓存
            CharacterCache.Put(characterId, character);
            
            if (EnableDetailedLogging)
            {
                Debug.Log($"角色加载成功: {character.characterName}");
            }
        }
        else
        {
            Debug.LogWarning($"角色不存在: {characterId}");
        }
  • 如果从数据库加载的角色不为null,则将其放入缓存,并记录加载成功的日志。

  • 如果为null,则记录警告日志,表示角色不存在。

复制代码
        return character;
    }
    catch (Exception ex)
    {
        Debug.LogError($"获取角色失败: {characterId}, 错误: {ex.Message}");
        return null;
    }
}
  • 返回从数据库加载的角色(可能为null)。

  • 如果上述过程发生异常,捕获异常并记录错误日志,然后返回null。

总结:

该方法尝试通过以下步骤获取角色:

  1. 检查缓存,如果存在则直接返回。

  2. 缓存不存在则从数据库加载。

  3. 将数据库加载的结果放入缓存。

  4. 返回角色对象或null(如果不存在或发生错误)。

相关推荐
阿波罗尼亚8 小时前
查询修正字段sql记录
数据库·sql·mysql
一个儒雅随和的男子8 小时前
Redis性能调优指南
数据库·redis·spring
老华带你飞8 小时前
动漫资讯|基于Springboot的动漫交流网站设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·国产动漫网站
rengang668 小时前
105-Spring AI Alibaba Module RAG 使用示例
java·人工智能·spring·rag·spring ai·ai应用编程
JIngJaneIL8 小时前
机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·机器人·论文·毕设·机器人门户展示系统
QQ12958455048 小时前
ThingsBoard部件数据结构解析
数据结构·数据库·物联网·iot
苦学编程的谢9 小时前
Redis_1_初识Redis+浅谈分布式系统
数据库·redis·缓存
人工智能教学实践9 小时前
Flask-SQLAlchemy 操作 SQLite 数据库示例
数据库·sqlite·flask
西岭千秋雪_9 小时前
Zookeeper监听机制
java·linux·服务器·spring·zookeeper