看await色变
C#的await关键字能让异步写法看起来像同步,写逻辑很顺畅,但是如果不稍加注意,也会踩坑。
最近几天游戏测试,在游戏重启服务器的时候发现有一个玩家竟然回档了,百思不得其解,在查了一下午后发现离谱而又合理的原因。
在服务器启动的时候,会将一部分玩家数据加载到内存中,查询数据库是个异步操作,可能需要耗费几秒钟的时间,此时当前进程并不能处理查询玩家的操作,需要等玩家数据预热之后才能处理。bug出在这里,在缓存服await查询数据库操作时,游戏逻辑服竟然收到了玩家的登录请求,此时从缓存服查询出的是不存在的玩家,所以新创建了一份玩家数据然后同步到缓存服务器,直接把数据库查询的数据覆盖了。(槽点太多,可就这么义无反顾地发生了)
在查看代码的时候看到了很多await关键字,现在看await色变。
有一些容易踩坑的点,比如在一个代码 await一个操作后,处理修改单例或是其他方法也能访问到的对象。因为其他的代码也能访问到,也会进行修改,可能await异步操作时,对象里的字段已经改了千八百遍了。再去对它进行操作,需要注意此时对象的状态。