MUD服务端重构为单Spawner线程后仅断点按F10步过可运行求助
问题根因及修复方案
1. 直接导致服务端无响应的核心问题
你注释掉了DoSpawnerLogic方法末尾的Thread.Sleep(33)代码,导致while(true)死循环没有任何等待逻辑,会直接占满一整个CPU核心的所有调度时间片。该线程优先级高于普通业务、IO线程,正常运行时会挤占控制台输出、主线程网络处理等其他所有线程的执行资源,所以看起来完全无响应。
单步调试时调试器会频繁暂停Spawner线程,其他线程能拿到时间片执行,所以单步状态下所有逻辑表现正常。
修复方式:直接取消Thread.Sleep(33)的注释即可解决无响应问题。
2. 导致怪物生成逻辑失效的隐藏问题
SpawnLogic中的spawnTime现在是方法局部变量,每次被调用都会被重新赋值为DateTime.Now.AddSeconds(1),永远不可能满足spawnTime < DateTime.Now的判断条件,怪物永远不会生成。
原先每个Spawner独立线程运行时,SpawnLogic内部有外层循环,spawnTime在循环外定义可以保持状态,改成全局统一调度后,该变量的生命周期不再符合逻辑要求。
修复方式:将spawnTime改为Spawner类的成员变量,不要每次调用SpawnLogic都重置。
3. 其他需要修复的并发/逻辑问题
- 每次调用
SpawnLogic都会实例化新的Random对象,Random默认以系统时间戳为种子,循环调用间隔极短的情况下,多个Random实例的种子完全相同,生成的随机数序列会完全重复。建议将Random改为Spawner类的成员变量,仅在Spawner初始化时实例化一次。 - 目前操作
SpawnerList、NewSpawners、RemoveSpawners等全局集合时未加锁,若有其他线程(如主线程、玩家操作线程)同时修改这些集合,会触发「集合已修改,枚举操作可能不会执行」的运行时异常,建议给这些集合的所有读写操作加同一把锁。 _deadSpawn的锁时机错误:先判断_deadSpawn.Count > 0再进入锁块,判断Count的操作未加锁,若判断完成后刚好有其他线程修改_deadSpawn,会出现并发异常,建议将整个_deadSpawn的判断和处理逻辑都移入锁块内。
内容的提问来源于stack exchange,提问作者jtsmith1287
相关产品推荐
相关产品推荐

