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

相关推荐
Chan1612 分钟前
场景题:CPU 100% 问题怎么排查?
java·数据库·redis·后端·spring
电商API_1800790524734 分钟前
批量获取电商商品数据的主流技术方法全解析
大数据·数据库·人工智能·数据分析·网络爬虫
rgeshfgreh1 小时前
Python流程控制:从条件到循环实战
前端·数据库·python
煎蛋学姐1 小时前
SSM校园物品交易系统ua3tg(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生管理·ssm 框架·商品信息管理·校园物品交易系统·商品分类
conca1 小时前
Java+MySQL时区难题-Date自动转换String差8小时
数据库·mysql
萧曵 丶2 小时前
Redis 是单线程的吗?
数据库·redis
老邓计算机毕设2 小时前
SSM校园招聘管理系统968b0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·校园招聘管理系统·简历投递
Zoey的笔记本2 小时前
敏捷与稳定并行:Scrum看板+BPM工具选型指南
大数据·前端·数据库·python·低代码
晴天¥2 小时前
Oracle DB 的相关管理工具
数据库·oracle