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。
总结:
该方法尝试通过以下步骤获取角色:
-
检查缓存,如果存在则直接返回。
-
缓存不存在则从数据库加载。
-
将数据库加载的结果放入缓存。
-
返回角色对象或null(如果不存在或发生错误)。