根据角色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(如果不存在或发生错误)。

相关推荐
剩下了什么7 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥7 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉7 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变7 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记9 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里10 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科10 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦10 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
晚霞的不甘12 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
MX_935912 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring